{"version":3,"file":"cxense.stubru.min.js","sources":["../../src/helpers/Storage.js","../../src/helpers/getValueFromObjectList.js","../../src/helpers/getCachedSegments.js","../../src/helpers/UserSync.js","../../src/helpers/clean.js","../../src/setup.js","../../src/helpers/getLangIdFromUrl.js","../../src/helpers/getConsent.js","../../src/helpers/createScript.js","../../src/helpers/sha256.js"],"sourcesContent":["import log from './logger';\n\n/**\n * This class sets, gets and deletes entries\n * in localStorage and sessionStorage.\n */\n\nclass Storage {\n static set = (key, value, type) => {\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.setItem) {\n try {\n window.localStorage.setItem(key, value);\n log(`set ${key}=${value} to local storage`);\n } catch (err) {\n log(`unable to set ${key} to local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.setItem) {\n try {\n window.sessionStorage.setItem(key, value);\n log(`set ${key}=${value} to session storage`);\n } catch (err) {\n log(`unable to set ${key} to session storage`);\n log(err);\n }\n }\n }\n\n return null;\n };\n static get = (key, type) => {\n let value;\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.getItem) {\n try {\n value = window.localStorage.getItem(key);\n log(`get ${key}=${value} from local storage`);\n } catch (err) {\n log(`unable to get ${key} from local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.setItem) {\n try {\n value = window.sessionStorage.getItem(key);\n log(`get ${key}=${value} from session storage`);\n } catch (err) {\n log(`unable to get ${key} from session storage`);\n log(err);\n }\n }\n }\n\n return value;\n };\n static del = (key, type) => {\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.removeItem) {\n try {\n window.localStorage.removeItem(key);\n log(`delete ${key} from local storage`);\n } catch (err) {\n log(`unable to delete ${key} from local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.removeItem) {\n try {\n window.sessionStorage.removeItem(key);\n log(`delete ${key} from session storage`);\n } catch (err) {\n log(`unable to delete ${key} from session storage`);\n log(err);\n }\n }\n }\n\n return null;\n };\n}\n\nexport default Storage;\n","import log from './logger';\nimport Storage from './Storage';\n\nconst getValueFromObjectList = (arr = []) => {\n const getValue = obj => {\n let objSplitted;\n let value = null;\n let property = obj.name;\n switch (obj.type) {\n case 'object':\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n value = window[objSplitted[0]];\n objSplitted.forEach((val, index) => {\n if (index > 0) {\n try {\n value = value[objSplitted[index]];\n } catch (err) {\n log(err);\n }\n }\n });\n break;\n case 'localStorage':\n value = Storage.get(obj.name, 'localStorage');\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n break;\n case 'cookie':\n if (document.cookie && obj.name) {\n const name = `${obj.name}=`;\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i += 1) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n value = c.substring(name.length, c.length);\n }\n }\n }\n break;\n case 'url':\n value = document.location.search;\n if (value) {\n value = value.match(`[\\\\?&]${obj.name}=([^\\\\?&]+)`);\n value ? (value = value[1]) : (value = null);\n property = obj.name;\n }\n break;\n case 'method': {\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n const method = objSplitted\n .slice(-1)[0]\n .match(/(.*)\\(\\\\?'?([^\\\\']*)\\\\?'?\\)/);\n value = window[objSplitted[0]];\n objSplitted.pop(); // last element can be removed as it is not an object\n objSplitted.forEach((val, index) => {\n if (index > 0) {\n value = value[objSplitted[index]];\n }\n });\n value = value[method[1]](method[2]);\n break;\n }\n case 'datalayer':\n value = window.dataLayer.find(data => data.event === 'pageview')[\n obj.name\n ];\n break;\n case 'dataAttribute':\n try {\n const script = document.querySelector(`script[${obj.name}]`);\n value = script && script.getAttribute(obj.name);\n } catch (err) {\n log(err);\n }\n break;\n default:\n // do nothing\n }\n\n // we are allready logging in the Storage class\n if (obj.type !== 'localStorage') {\n log(`get ${obj.name}=${value} from ${obj.type}`);\n }\n\n return [value, property];\n };\n\n return arr.find(el => {\n const [value, property] = getValue(el);\n el.value = value;\n el.property = property;\n\n return value !== null;\n });\n};\n\nexport default getValueFromObjectList;\n","import Storage from './Storage';\nimport log from './logger';\n\nconst getCachedSegments = (k = []) => {\n let rawSegmentIds;\n let segmentIds = [];\n let keys;\n const list = PERSIST.segments;\n\n // if no argument, we use all the segment keys\n k.length ? (keys = list.filter(i => i.name.includes(k))) : (keys = list);\n\n keys.forEach(key => {\n rawSegmentIds = Storage.get(key.name, key.type);\n rawSegmentIds\n ? (segmentIds = segmentIds.concat(JSON.parse(rawSegmentIds)))\n : log(`segment key ${key.name} not found in ${key.type}`);\n });\n\n return segmentIds;\n};\n\nexport default getCachedSegments;\n","import getCachedSegments from '../helpers/getCachedSegments';\nimport log from '../helpers/logger';\n\n/**\n * handles string and objects containing SSP configuration\n * for either client or server user syncing\n */\n\nclass UserSync {\n constructor(ssps) {\n this.ssps = ssps;\n }\n\n static _getType = ssp => {\n let type;\n if (typeof ssp === 'string') {\n type = 's2s';\n } else if (typeof ssp === 'object' && ssp.type) {\n type = ssp.type;\n }\n\n return type;\n };\n\n sendRequests() {\n this.ssps.forEach(ssp => {\n if (UserSync._getType(ssp) === 's2s') {\n window.cX.callQueue.push(['sync', ssp]);\n log(`add usersync for ${ssp.partner ? ssp.partner : ssp} to queue`);\n } else {\n const keys = ssp.keys || [];\n switch (ssp.partner) {\n case 'appnexus':\n UserSync._appNexusS2s(ssp.customerId, getCachedSegments(keys));\n break;\n case 'facebook':\n UserSync._facebook(ssp.customerId, getCachedSegments(keys));\n break;\n default:\n }\n }\n });\n }\n\n static _appNexusS2s = (id, seg) => {\n if (seg.length > 0) {\n const el = document.createElement('img');\n const prefix = 'cxsegment_';\n const keyvalues = [];\n keyvalues.push(`add_Code=${prefix}${seg.join(`,${prefix}`)}`);\n keyvalues.push(`member=${id}`);\n el.setAttribute('src', `//ib.adnxs.com/seg?${keyvalues.join('&')}`);\n el.setAttribute('width', '1');\n el.setAttribute('height', '1');\n el.style.width = '1px';\n el.style.height = '1px';\n if (document.body) document.body.appendChild(el);\n }\n };\n\n static _facebook = (id, seg) => {\n if (typeof window.fbq === 'undefined') {\n return;\n }\n\n // fbq ignores long arrays\n const chunk = 80;\n let i = 0;\n\n for (i; i < seg.length; i += chunk) {\n window.fbq('trackSingleCustom', id, 'CxSegments', {\n segmentIds: seg.slice(i, i + chunk),\n });\n }\n };\n}\n\nexport default UserSync;\n","/*\n * @see https://wiki.cxense.com/display/cust/Event+data\n * Limitation: The maximum allowed identifier length is 64 characters.\n * The valid characters in customer identifiers are digits (0 to 9), \n * characters A to Z, a to z, space \n * and the special characters \"=\", \"@\", \"+\", \"-\", \"_\" and \".\".\n */\nconst clean = str => {\n const len = 64;\n str = str.replace(/[^A-Za-z0-9 =@+\\-_.]/g, '');\n str = str.substring(0, len);\n\n return str;\n};\n\nexport default clean;\n","/* eslint-disable radix */\nimport createScript from './helpers/createScript';\nimport getValueFromObjectList from './helpers/getValueFromObjectList';\nimport getAllKeyValues from './helpers/getAllKeyValues';\nimport getLangIdFromUrl from './helpers/getLangIdFromUrl';\nimport getRegioFromCookie from './helpers/getRegioFromCookie';\nimport funnelEvents from './adapters/funnelEvents';\nimport intentEvents from './adapters/intentEvents';\nimport nativeArticleReads from './adapters/nativeArticleReads';\nimport Storage from './helpers/Storage';\nimport UserSync from './helpers/UserSync';\nimport clean from './helpers/clean';\nimport log from './helpers/logger';\nimport getConsent from './helpers/getConsent';\nimport apiAddExternalId from './helpers/apiAddExternalId';\nimport THEOplayersTracker from './adapters/THEOplayersTracker';\nimport sha256 from './helpers/sha256';\n\nconst init = e => {\n const cxjs = 'https://cdn.cxense.com/cx.js';\n const siteid = getLangIdFromUrl(CXENSE_SITE_ID);\n const prefix = PREFIX;\n const persist = PERSIST;\n const custom = { ...CUSTOM_CMP, ...CUSTOM_DMP };\n const eid = getValueFromObjectList(USER);\n const id = eid && eid.value ? clean(eid.value) : false;\n const cached = persist\n ? parseInt(Storage.get(persist.cache.name, persist.cache.type))\n : 0;\n\n /*\n 0 new\n 1 cached without eid\n 2 cached with eid\n */\n\n // block all if we don't have consent\n const consent =\n custom.name && custom.vendor\n ? getConsent(custom.name, custom.vendor)\n : Promise.resolve(true);\n\n consent\n .then(c => {\n log(`consent ${c} for ${custom.vendor} in ${custom.name}`);\n if (c) {\n // initialize\n window.cX = window.cX || CXINIT;\n createScript(cxjs);\n window.cX.shouldPoll = false;\n window.cX.callQueue = window.cX.callQueue || [];\n\n // Single Page Application\n if (e) {\n window.cX.callQueue.push(['initializePage']);\n }\n\n // setSiteId\n window.cX.callQueue.push(['setSiteId', siteid]);\n\n if (USER) {\n // addExternalId\n if (id && cached !== 2) {\n window.cX.callQueue.push(['addExternalId', { id, type: prefix }]);\n if (custom.prefix && custom.queryid) {\n apiAddExternalId(\n id,\n custom.prefix,\n custom.queryid,\n !!custom.hash\n );\n }\n }\n }\n\n if (CUSTOM) {\n // setCustomParameters\n const cp = getAllKeyValues(CUSTOM);\n if (cp) {\n window.cX.callQueue.push(['setCustomParameters', cp]);\n }\n }\n\n // async actions which require the cX to be ready\n window.cX.callQueue.push([\n 'invoke',\n () => {\n // start invoke\n // query string parameters to fetch from the URL\n if (URLARGS) {\n const urlArgs = window.cX.parseUrlArgs();\n const allowed = URLARGS;\n\n const cp = Object.keys(urlArgs)\n .filter(key => allowed.includes(key))\n .reduce((obj, key) => {\n obj[key] = urlArgs[key];\n return obj;\n }, {});\n\n window.cX.setCustomParameters(cp);\n }\n // end invoke\n },\n ]);\n\n // next 3 adapters use a default pqid from MH\n if (MH_SHOP)\n // webshop events\n funnelEvents();\n\n if (INTENT)\n // intent events (Audience Interest Group)\n intentEvents();\n\n // deprecated after Nativo migration\n if (MH_ARTICLE_READ)\n // native article reads\n nativeArticleReads();\n\n if (MH_REGIO) {\n // regio box on popular MH titles\n const pc = getRegioFromCookie();\n if (pc) {\n window.cX.callQueue.push([\n 'setUserProfileParameters',\n { regiobox: [pc] },\n ]);\n }\n }\n\n // stuff that needs to be stored so it can be reused in adserving\n if (PERSIST) {\n if (SYNC) {\n if (!cached) {\n const u = new UserSync(SYNC);\n u.sendRequests();\n }\n }\n\n window.cX.callQueue.push([\n 'invoke',\n () => {\n // register userid in localStorage\n const uid = window.cX.getUserId();\n Storage.set(persist.user.name, uid, persist.user.type);\n persist.segments.forEach(segment => {\n // register segmentids in localStorage\n try {\n window.cX.getUserSegmentIds(\n {\n persistedQueryId: segment.queryid,\n callback: userSegmentIds => {\n Storage.set(\n segment.name,\n JSON.stringify(userSegmentIds),\n segment.type\n );\n },\n },\n id // if externalID\n ? {\n identities: [\n {\n id: segment.hash ? sha256(id) : id,\n type: segment.prefix ? segment.prefix : prefix,\n }, // overwrite default prefix?\n ],\n }\n : {}\n );\n } catch (err) {\n log(`unable to get userSegmentIds from API`);\n log(err);\n }\n });\n },\n ]);\n // use cache flag to perform some actions only once per session\n Storage.set(persist.cache.name, id ? 2 : 1, persist.cache.type);\n }\n\n // Send Page View Event\n if (window.location.pathname.match(FILTER)) {\n window.cX.callQueue.push([\n 'sendPageViewEvent',\n {\n location: window.location.href,\n referrer: document.referrer,\n useAutoRefreshCheck: false,\n },\n ]);\n }\n }\n\n return false;\n })\n .catch(() => {\n // do nothing\n });\n};\n\n// run on content reload\nif (TRIGGER) {\n const eventIn = TRIGGER.in;\n const eventOut = TRIGGER.out;\n\n // tell website this library is ready\n document.dispatchEvent(new CustomEvent(eventOut));\n log(`dispatching '${eventOut}' event`);\n // run this script as a pageview\n document.addEventListener(eventIn, init);\n log(`waiting for '${eventIn}' event to initialize`);\n}\n\n// run on every onload/refresh for non-SPA or hybrid SPA\nif (!TRIGGER || TRIGGER.hybrid) {\n log(`init`);\n init(false);\n\n // SBS video events with Drupal info\n // outside of init(), don't want to run more then once\n if (SBS_VIDEO) {\n const p = new THEOplayersTracker();\n p.listenPlayerReady();\n }\n}\n","const getLangIdFromUrl = langIds => {\n if (typeof langIds !== 'object') {\n return langIds;\n }\n\n const url = document.location.href;\n // we only look up the lang codes in the URL from the settings file\n const langs = Object.keys(langIds).join('|');\n // template literal: /(\\/|=)(fr|nl|en)(\\/|#|\\.|\\?|$)/g\n // works on \"https://www.mediahuis.be/fr/detailpage\" or \"https://fr.mediahuis.be\"\n const regex = new RegExp(`(/|=)(${langs})(/|#|\\\\.|\\\\?|$)`, 'gi');\n const result = regex.exec(url);\n\n return result ? langIds[result[2]] : langIds[Object.keys(langIds)[0]];\n};\n\nexport default getLangIdFromUrl;\n","/* eslint-disable no-restricted-globals */\nimport log from './logger';\n\nconst getConsent = (cmpName, vendorId) => {\n let consent;\n const __tcfapi = window.__tcfapi;\n switch (cmpName) {\n case 'didomi':\n consent = new Promise(resolve => {\n const w = parent.window;\n w.didomiOnReady = w.didomiOnReady || [];\n w.didomiOnReady.push(() => {\n consent = w.Didomi.getUserConsentStatusForVendor(vendorId);\n resolve(consent);\n });\n });\n break;\n case 'liveramp':\n consent = new Promise(resolve => {\n __tcfapi(\n 'checkConsent',\n 2,\n data => {\n resolve(data);\n },\n { data: [{ vendorId }] }\n );\n });\n break;\n case 'sourcepoint':\n consent = new Promise(resolve => {\n __tcfapi('getCustomVendorConsents', 2, data => {\n resolve(!!data.grants[vendorId].vendorGrant);\n });\n });\n break;\n // case 'quantcast':\n // consent = new Promise(resolve => {\n // __tcfapi('addEventListener', 2, () => {\n // __tcfapi('getNonIABVendorConsents', 2, (data, success) => {\n // if (success) resolve(data.nonIabVendorConsents[vendorId]);\n // });\n // });\n // });\n // break;\n case 'consentmanager':\n consent = new Promise(resolve => {\n window.__cmp(\n 'addEventListener',\n [\n 'consent',\n () => resolve(window.__cmp('getCMPData').vendorConsents[vendorId]),\n false,\n ],\n null\n );\n });\n break;\n default:\n consent = Promise.resolve(false);\n log(`unknown CMP, check settings`);\n }\n\n return consent;\n};\n\nexport default getConsent;\n","const createScript = src =>\n new Promise((resolve, reject) => {\n if (typeof document === 'undefined') {\n resolve();\n }\n\n const scriptTag = document.createElement('script');\n const node = document.getElementsByTagName('script')[0];\n scriptTag.src = src;\n scriptTag.onload = resolve;\n scriptTag.onerror = reject;\n scriptTag.async = true;\n node.parentNode.insertBefore(scriptTag, node);\n });\n\nexport default createScript;\n","/* eslint-disable no-multi-assign */\n/* eslint-disable no-bitwise */\nconst sha256 = ascii => {\n const rightRotate = (value, amount) =>\n (value >>> amount) | (value << (32 - amount));\n\n const mathPow = Math.pow;\n const maxWord = mathPow(2, 32);\n const lengthProperty = 'length';\n let i; // Used as a counter across the whole file\n let j; // Used as a counter across the whole file\n let result = '';\n\n const words = [];\n const asciiBitLength = ascii[lengthProperty] * 8;\n\n //* caching results is optional - remove/add slash from front of this line to toggle\n // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\n // (we actually calculate the first 64, but extra values are just ignored)\n let hash = (sha256.h = sha256.h || []);\n // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\n const k = (sha256.k = sha256.k || []);\n let primeCounter = k[lengthProperty];\n\n /* /\n\tvar hash = [], k = [];\n\tvar primeCounter = 0;\n\t//*/\n\n const isComposite = {};\n for (let candidate = 2; primeCounter < 64; candidate += 1) {\n if (!isComposite[candidate]) {\n for (i = 0; i < 313; i += candidate) {\n isComposite[i] = candidate;\n }\n hash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0;\n k[primeCounter] = (mathPow(candidate, 1 / 3) * maxWord) | 0;\n primeCounter += 1;\n }\n }\n\n ascii += '\\x80'; // Append Ƈ' bit (plus zero padding)\n while (ascii[lengthProperty] % 64 - 56) ascii += '\\x00'; // More zero padding\n for (i = 0; i < ascii[lengthProperty]; i += 1) {\n j = ascii.charCodeAt(i);\n if (j >> 8) return; // ASCII check: only accept characters in range 0-255\n words[i >> 2] |= j << (((3 - i) % 4) * 8);\n }\n words[words[lengthProperty]] = (asciiBitLength / maxWord) | 0;\n words[words[lengthProperty]] = asciiBitLength;\n\n // process each chunk\n for (j = 0; j < words[lengthProperty]; ) {\n const w = words.slice(j, (j += 16)); // The message is expanded into 64 words as part of the iteration\n const oldHash = hash;\n // This is now the undefinedworking hash\", often labelled as variables a...g\n // (we have to truncate as well, otherwise extra entries at the end accumulate\n hash = hash.slice(0, 8);\n\n for (i = 0; i < 64; i += 1) {\n // eslint-disable-next-line no-unused-vars\n const i2 = i + j;\n // Expand the message into 64 words\n // Used below if\n const w15 = w[i - 15];\n const w2 = w[i - 2];\n\n // Iterate\n const a = hash[0];\n const e = hash[4];\n const temp1 =\n hash[7] +\n (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + // S1\n ((e & hash[5]) ^ (~e & hash[6])) + // ch\n k[i] +\n // Expand the message schedule if needed\n (w[i] =\n i < 16\n ? w[i]\n : (w[i - 16] +\n (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) + // s0\n w[i - 7] +\n (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10))) | // s1\n 0);\n // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\n const temp2 =\n (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + // S0\n ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj\n\n hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\n hash[4] = (hash[4] + temp1) | 0;\n }\n\n for (i = 0; i < 8; i += 1) {\n hash[i] = (hash[i] + oldHash[i]) | 0;\n }\n }\n\n for (i = 0; i < 8; i += 1) {\n for (j = 3; j + 1; j -= 1) {\n const b = (hash[i] >> (j * 8)) & 255;\n result += (b < 16 ? 0 : '') + b.toString(16);\n }\n }\n // eslint-disable-next-line consistent-return\n return result;\n};\n\nexport default sha256;\n"],"names":["Storage","key","value","type","window","localStorage","setItem","err","sessionStorage","getItem","removeItem","getValueFromObjectList","arr","find","el","obj","objSplitted","property","name","split","length","forEach","val","index","get","document","cookie","ca","decodeURIComponent","i","c","charAt","substring","indexOf","location","search","match","method","slice","pop","dataLayer","data","event","script","querySelector","getAttribute","getValue","getCachedSegments","k","rawSegmentIds","segmentIds","list","filter","includes","concat","JSON","parse","UserSync","ssps","sendRequests","ssp","_getType","cX","callQueue","push","partner","keys","_appNexusS2s","customerId","_facebook","id","seg","createElement","keyvalues","join","setAttribute","style","width","height","body","appendChild","fbq","e","siteid","persist","custom","eid","cached","langIds","url","href","langs","Object","result","RegExp","exec","getLangIdFromUrl","replace","parseInt","cache","vendor","cmpName","vendorId","consent","__tcfapi","Promise","resolve","w","parent","didomiOnReady","Didomi","getUserConsentStatusForVendor","grants","vendorGrant","__cmp","vendorConsents","getConsent","then","src","reject","scriptTag","node","getElementsByTagName","onload","onerror","async","parentNode","insertBefore","shouldPoll","uid","getUserId","set","user","segments","segment","getUserSegmentIds","persistedQueryId","queryid","callback","userSegmentIds","stringify","identities","hash","sha256","ascii","j","rightRotate","amount","mathPow","Math","pow","maxWord","words","asciiBitLength","h","primeCounter","isComposite","candidate","charCodeAt","oldHash","w15","w2","a","temp1","b","toString","prefix","pathname","referrer","useAutoRefreshCheck","catch"],"mappings":"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"}