1/* 2 * Gravito CMP configuration and bootstrap. 3 * 4 * LOADED WITH async FROM header.php. Two consequences, both load-bearing: 5 * 6 * 1. This file may execute BEFORE <body> exists. Append the SDK tag to 7 * document.head, never document.body â appending to a null body throws, 8 * and a throw here means no consent signal, which means GAM renders no ads 9 * at all, on every page. There is no visual warning; the ads are simply 10 * absent. 11 * 12 * 2. Per-site branding arrives via window.popmediaCmp, set by an inline script 13 * earlier in <head>. Inline scripts run during parse, so it is always 14 * defined by the time this runs. The fallbacks below still apply if it is 15 * missing, so the dialog degrades rather than breaking. 16 * 17 * Before 21 Aug 2026 the logo URL and colours were hardcoded to como.fi here, 18 * in a file that ships with the parent â so all eight publications showed 19 * como's logo, fetched cross-domain, in como's colours. 20 */ 21var pmCmp = window.popmediaCmp || {}; 22 23 window.gravito = {}; 24 // add config object to gravito 25 window.gravito.config = { 26 "cmp": { 27 "settings": { 28 "useTopDomain": true, 29 "catchCMPEvents": true, 30 "syncAfter": 1800, 31 "sdkVersion": 6, 32 "version": "latest" 33 }, 34 "styles": { 35 "logoUrl": pmCmp.logoUrl || "https://www.popmedia.fi/popmedia-logo.png", 36 "logoAltText": pmCmp.logoAltText || "Pop Media", 37 "allowBackgroundScroll": false, 38 "isLayeredLayout": true, 39 "primaryColor": pmCmp.primaryColor || "#CC006A", 40 "secondaryColor": pmCmp.secondaryColor || "#666666", 41 "headerColor": "#ffffff", 42 "footerColor": "#e6e6e6", 43 "fonts": [] 44 }, 45 "tcf": { 46 "core": { 47 "languageCode": "fi", 48 "publisherCountryCode": "FI", 49 "purposeOneTreatment": false, 50 "hideLegitimateInterest": false, 51 "legitimateInterestDefaultBehavaior": true, 52 "purposes": [ 53 { 54 "type": "purposes", 55 "id": 1 56 }, 57 { 58 "type": "stacks", 59 "id": 26 60 }, 61 { 62 "type": "purposes", 63 "id": 10 64 } 65 ], 66 "specialPurposes": [ 67 1, 68 2 69 ], 70 "necessaryLegitimatePurposes": [], 71 "vendors": [ 72 1, 73 8, 74 10, 75 11, 76 12, 77 15, 78 16, 79 21, 80 25, 81 30, 82 32, 83 39, 84 40, 85 45, 86 50, 87 52, 88 57, 89 62, 90 63, 91 68, 92 69, 93 70, 94 76, 95 82, 96 84, 97 91, 98 93, 99 97, 100 98, 101 102, 102 111, 103 115, 104 122, 105 126, 106 128, 107 129, 108 130, 109 131, 110 132, 111 133, 112 134, 113 140, 114 154, 115 165, 116 190, 117 209, 118 213, 119 217, 120 226, 121 238, 122 241, 123 253, 124 264, 125 276, 126 278, 127 285, 128 290, 129 315, 130 358, 131 373, 132 385, 133 387, 134 394, 135 412, 136 415, 137 434, 138 493, 139 502, 140 565, 141 580, 142 597, 143 610, 144 612, 145 667, 146 684, 147 707, 148 729, 149 755, 150 772, 151 793, 152 812, 153 851, 154 1029, 155 1242, 156 160, 157 1100, 158 1126, 159 1234, 160 77, 161 78, 162 95, 163 126, 164 156, 165 273, 166 275, 167 278, 168 422, 169 517, 170 922 171 ], 172 "necessaryVendors": [], 173 "features": [ 174 1, 175 2, 176 3 177 ], 178 "specialFeatures": [ 179 1, 180 2 181 ], 182 "useACM": true, 183 "googleVendors": [], 184 "useGCM": true, 185 "useAdvanceGCM": true, 186 "adsConsentId": [ 187 1 188 ], 189 "adsUserDataConsentId": [ 190 1, 191 7 192 ], 193 "adsPersonalizationConsentId": [ 194 3, 195 4 196 ], 197 "analyticsConsentId": [ 198 7, 199 9, 200 10 201 ], 202 "functionalityStorageConsentId": [ 203 10 204 ], 205 "functionalityStorageId": false, 206 "personalizationStorageConsentId": [ 207 1, 208 4 209 ], 210 "personalizationStorageId": false, 211 "securityStorageConsentId": [ 212 9 213 ], 214 "securityStorageId": true, 215 "useUET": false, 216 "nonTCFVendors": [], 217 "customPurposes": [], 218 "publisherRestrictions": [ 219 { 220 "purposeID": 1, 221 "restrictionType": "REQUIRE_CONSENT", 222 "vendors": [ 223 6, 224 12 225 ] 226 }, 227 { 228 "purposeID": 1, 229 "restrictionType": "REQUIRE_CONSENT", 230 "vendors": [ 231 8 232 ] 233 }, 234 { 235 "purposeID": 2, 236 "restrictionType": "REQUIRE_CONSENT", 237 "vendors": [ 238 8 239 ] 240 } 241 ], 242 "cookieName": "TcString", 243 "cookieExpiry": 365, 244 "rejectAllCookieExpiry": 365, 245 "version": 9, 246 "googleTcfId": 755 247 }, 248 "languages": { 249 "fi": { 250 "label": "Suomi", 251 "nonTCFVendors": [], 252 "customPurposes": [], 253 "text": { 254 "declaration": { 255 "header": "Arvostamme yksityisyyttäsi", 256 "title": "Tarvitsemme suostumuksesi tarjotaksemme henkilökohtaisen käyttökokemuksen", 257 "introductionText": "Me ja huolellisesti valitsemamme <span id='partners-link'>{VendorsCount} teknologiakumppania</span> hyödynnämme henkilötietoja tarjotaksemme paremman käyttäjäkokemuksen sekä kohdentaaksemme sisältöä j
257a mainoksia.", 258 "consentableItemDescription": "Hyväksymällä suostut tietojesi käyttöön seuraavasti", 259 "legalFooter": "Käytämme laitetunnisteita ja tallennamme evästeitä laitteellesi saadaksemme tietoja esimerkiksi sivuista, joilla vierailit, IP-osoitteestasi sekä laitteesi ominaisuuksista. Pääset tutustumaan yksityiskohtaisesti käyttötarkoituksiin ja teknologiakumppaneihimme seuraavalla välilehdellä. Hylkääminen voi vaikuttaa sivuston toimivuuteen ja käytettävyyteen.<br/><br/>Jotkin teknologiamme voivat käsitellä tietoja myös ilman suostumusta, jos niillä on siihen oikeutettu peruste. Voit vastustaa tätä tai muuttaa asetuksiasi milloin tahansa seuraavalla välilehdellä." 260 }, 261 "details": { 262 "header": "Valintasi", 263 "title": "Suostumusasetukset", 264 "introductionText": "Tässä alla voit tehdä yksityiskohtaisia valintojasi ja myös vastustaa tietojen käsittelyn oikeutettua perustetta, jos katsot sen aiheettomaksi. Pääset muuttamaan valintojasi millon tahansa linkistä sivujemme alaosassa.", 265 "purposesTabDescription": "Tässä pääset tutustumaan yksityiskohtaisesti, mihin käyttötarkoituksiin tietojasi hyödynnämme ja millaisia ominaisuuksia ne mahdollistavat.", 266 "vendorsTabDescription": "Sisällön ja mainosten kohdentamiseksi paremmin, nämä {VendorsCount} teknologiakumppaniamme tallentavat ja/tai käyttävät tietoja laitteellasi seuraavasti. Käytämme myös Googlen palveluita. Lue lisää siitä, miten Google käsittelee henkilökohtaisia tietojasi <a class='gravitoCMP-TCFCMP-link' href='https://business.safety.google/intl/fi/privacy/' target='_blank'>Google käsittelee henkilökohtaisia tietojasi.</a>", 267 "copyTCstringTooltip": "Napsauta tästä kopioidaksesi TC-merkkijonon leikepöydälle" 268 }, 269 "commonTerms": { 270 "acceptAll": "Hyväksyn kaikki", 271 "save": "Hyväksyn valitsemani", 272 "rejectAll": "Vain välttämättömät", 273 "settings": "Omat valintani", 274 "privacyPolicyLabel": "Tietosuojakäytäntömme", 275 "consent": "Suostumus", 276 "purposeAndCharacteristics": "Käyttötarkoitukset ja ominaisuudet", 277 "specialPurposes": "Erityiset käyttötarkoitukset", 278 "specialFeatures": "Erityiset ominaisuudet", 279 "features": "Ominaisuudet", 280 "nonTCFVendors": "Teknologiakumppanimme TCF:n ulkopuolelta", 281 "vendors": "Teknologiakumppanimme", 282 "vendorsTabHeader": "Teknologiakumppanimme", 283 "purposes": "Käyttötarkoitukset", 284 "legitimateInterest": "Oikeutettu etu", 285 "customPurposes": "Mukautetut tarkoitukset", 286 "cookieMaxAge": "Evästeen enimmäisikä (sekunnit)", 287 "disclouserDetails": "Yksityiskohdat", 288 "disclouserFetchingError": "JSON-tietojen hakeminen epäonnistui", 289 "disclouserHeaderIdentifier": "Tunniste", 290 "disclouserHeaderDomain": "Verkkotunnus", 291 "disclouserHeaderType": "Tyyppi", 292 "disclosureHeaderMaxAge": "Enimmäisikä", 293 "disclosureHeaderPurpose": "Käyttötarkoitukset", 294 "cookieRefresh": "Evästeen päivitys", 295 "usesCookies": "Käyttää evästeitä", 296 "usesNonCookieAccess": "Käyttää evästeetöntä ratkaisua", 297 "yes": "Kyllä", 298 "no": "Ei", 299 "seconds": "sekuntia", 300 "days": "päivää", 301 "alertMessageForCopiedTcString": "CMP-asetukset kopioitu", 302 "purposeIllustration": "Esimerkki", 303 "legitVendorCount": "Oikeutetun edun myyjät", 304 "consentVendorCount": "Suostumusmyyjät", 305 "stdRetention": "Vakiotallennus", 306 "dataDeclaration": "Ilmoitus tietojen käyttämisestä", 307 "vendorCountDeclarationText": "{VendorsCount} myyjää voi käyttää tätä", 308 "legIntClaim": "Oikeutettu vaatimus", 309 "dataDeclarationNameHeader": "Nimi", 310 "dataDeclarationIdHeader": "Tunnus", 311 "dataDeclarationDescriptionHeader": "Kuvaus", 312 "retention": "Säilytysaika", 313 "googleVendors": "Googlen myyjät", 314 "cancel": "Peruuta", 315 "confirm": "Vahvista", 316 "privacyPolicyUrl": "https://www.popmedia.fi/tietosuojaseloste/" 317 } 318 } 319 } 320 }, 321 "style": { 322 "hideContentOnFirstLayer": true, 323 "consentInputType": "checkbox", 324 "customCSS": "@font-face {\r\n font-family: 'Open Sans';\r\n font-weight: 300;\r\n src: local('Helvetica Neue'), local('Arial'), local('sans-serif');\r\n}\r\n@font-face {\r\n font-family: 'Open Sans';\r\n font-weight: 700;\r\n src: local('Arial Bold'), local('Helvetica Neue Bold'), local('sans-serif');\r\n}\r\n.gravitoCMP-logo {\r\n width: 174px;\r\n}\r\n\r\n#gravitoTCFCMP-layer1-reject-all,\r\n.gravitoCMP-footer-logo {\r\n display: none;\r\n}\r\n\r\n#gravitoTCFCMP-layer1-settings{\r\n display: block !important;\r\n}" 325 } 326 } 327 } 328}; 329 330var gravitoSDKTag = document.createElement("script"); 331gravitoSDKTag.src = "https://cdn.gravito.net/sdk/v6/latest/sdk.js"; 332gravitoSDKTag.onload = function () { 333 /*
334 * init() MUST NOT RUN BEFORE <body> EXISTS. 335 * 336 * The SDK appends its consent dialog to document.body. This file is loaded 337 * async from <head>, so onload can fire while the body is still null, and 338 * the SDK then throws: 339 * 340 * Uncaught TypeError: Cannot read properties of null (reading 'append') 341 * 342 * That kills the CMP, so consent never resolves, so the ad stack is never 343 * released â which surfaced as "no prebid found" on page after page. 344 * Niklas hit it on como.local, 21 Aug 2026. 345 * 346 * Gating on DOM readiness keeps the whole point of async: the SDK still 347 * DOWNLOADS in parallel with the HTML parse, which is the expensive part 348 * and the reason for moving off defer. Only the init call waits, and by 349 * then the file is usually already in cache. 350 */ 351 if (document.readyState === 'loading') { 352 document.addEventListener('DOMContentLoaded', function () { 353 window.gravito.init(); 354 }); 355 } else { 356 window.gravito.init(); 357 } 358}; 359document.head.appendChild(gravitoSDKTag);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.