1/** 2 * Licensed under the GNU General Public License v3.0 3 * SPDX-License-Identifier: GPL-3.0-only 4 * 5 * Based on https://keepandroidopen.org/banner.js 6 */ 7 8(function () { 9 "use strict"; 10 11 // ââ Localized banner strings ââââââââââââââââââââââââââââââââââââââââââ 12 var messages = { 13 fa: "ب٠تأÛÛØ¯ س٠آÙÙØ§ÛÙ Ù٠بگÙÛÛØ¯", 14 ar: "ÙÙ ÙØ§ ÙÙØªØÙÙ Ù Ù Ø§ÙØ¹Ù ر عبر Ø§ÙØ¥ÙØªØ±ÙØª", 15 he: "×××ר ×× ×××××ת ××× ××§×××", 16 en: "Say No to Online Age Verification", 17 ca: "Digues no a la verificació d'edat en lÃnia", 18 cs: "ÅeknÄte ne online ovÄÅovánà vÄku", 19 de: "Sagen Sie Nein zur Online-Altersverifikation", 20 da: "Sig nej til online aldersverifikation", 21 nl: "Zeg nee tegen online leeftijdsverificatie", 22 el: "ΠείÏε ÏÏι ÏÏην εÏÎ±Î»Î®Î¸ÎµÏ Ïη Î·Î»Î¹ÎºÎ¯Î±Ï ÏÏο διαδίκÏÏ Î¿", 23 es: "Di no a la verificación de edad en lÃnea", 24 fr: "Dites non à la vérification dââge en ligne", 25 id: "Katakan tidak pada verifikasi usia online", 26 it: "Dì no alla verifica dellâetà online", 27 ko: "ì¨ë¼ì¸ ì°ë ¹ íì¸ì ë°ëíì¸ì", 28 pl: "Powiedz nie weryfikacji wieku online", 29 "pt-BR": "Diga não à verificação de idade online", 30 ru: "СкажиÑе Ð½ÐµÑ Ð¾Ð½Ð»Ð°Ð¹Ð½-пÑовеÑке возÑаÑÑа", 31 sk: "Povedzte nie overovaniu veku online", 32 th: "à¸à¸à¸´à¹à¸ªà¸à¸à¸²à¸£à¸¢à¸·à¸à¸¢à¸±à¸à¸à¸²à¸¢à¸¸à¸à¸à¸à¹à¸¥à¸à¹", 33 tr: "Ãevrimiçi yaÅ doÄrulamasına hayır deyin", 34 uk: "СкажÑÑÑ Ð½Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½-пеÑевÑÑÑÑ Ð²ÑкÑ", 35 "zh-CN": "对å¨çº¿å¹´é¾éªè¯è¯´ä¸", 36 "zh-TW": "å°ç·ä¸å¹´é½¡é©è說ä¸", 37 ja: "ãªã³ã©ã¤ã³å¹´é½¢ç¢ºèªã«å対ããã", 38 fi: "Sano ei verkkoiän varmistukselle", 39 hu: "Mondj nemet az online életkor-ellenÅrzésre", 40 vi: "Nói không vá»i xác minh Äá» tuá»i trá»±c tuyến", 41 }; 42 43 // ââ Parse query parameters ââââââââââââââââââââââââââââââââââââââââââââ 44 function getScriptParams() { 45 var params = {}; 46 try { 47 var src = document.currentScript && document.currentScript.src; 48 if (!src) return params; 49 var q = src.indexOf("?"); 50 if (q === -1) return params; 51 var pairs = src.substring(q + 1).split("&"); 52 for (var i = 0; i < pairs.length; i++) { 53 var kv = pairs[i].split("="); 54 params[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1] || ""); 55 } 56 } catch (e) {} 57 return params; 58 } 59 60 var params = getScriptParams(); 61 62 // ââ Determine locale ââââââââââââââââââââââââââââââââââââââââââââââââââ 63 function resolveLocale(tag) { 64 if (!tag) return "en"; 65 if (messages[tag]) return tag; 66 67 var lower = tag.toLowerCase(); 68 69 for (var key in messages) { 70 if (key.toLowerCase() === lower) return key; 71 } 72 73 var base = lower.split("-")[0]; 74 75 for (var key2 in messages) { 76 if (key2.toLowerCase() === base) return key2; 77 } 78 79 for (var key3 in messages) { 80 if (key3.toLowerCase().split("-")[0] === base) return key3; 81 } 82 83 return "en"; 84 } 85 86 var locale = resolveLocale( 87 params.lang || 88 document.documentElement.lang || 89 navigator.language || 90 navigator.userLanguage 91 ); 92 93 // ââ Size variant ââââââââââââââââââââââââââââââââââââââââââââââââââââââ 94 var size = params.size === "mini" ? "mini" 95 : params.size === "minimal" 96 ? "minimal" 97 : "normal"; 98 99 // ââ Link âââââââââââââââââââââââââââââââââââââââââââââââââââ 100 var linkParam = params.link; 101 var defaultLink = "https://reclaimthenet.org/age-verification"; 102 var linkUrl = linkParam === "none" ? null : (linkParam || defaultLink); 103 104 // ââ Close button âââââââââââââââââââââââââââââââââââââââââââââââââââââ 105 var showClose = params.hidebutton !== "off"; 106 var storageKey = "kao-banner-hidden"; 107 var dismissDays = 30; 108 109 // ââ CSS ââââââââââââââââââââââââââââââââââââââââââââââââââ 110 var cssNormal = 111 ".kao-banner{" + 112 "position:relative;" + 113 "background:linear-gradient(180deg,#d32f2f 0%,#b71c1c 100%);" + 114 "border-bottom:4px solid #801313;" + 115 "color:#fff;" + 116 "font-family:'Arial Black',sans-serif;" + 117 "font-weight:900;" + 118 "text-transform:uppercase;" + 119 "letter-spacing:2px;" + 120 "font-size:1.5rem;" + 121 "text-align:center;" + 122 "padding:0.5rem 2.5rem;" + 123 "}"; 124 125 var cssMini = 126 ".kao-banner{" + 127 "font-size:0.75rem;padding:0.25rem 1.5rem;" + 128 "}"; 129 130 var cssMinimal = cssMini; 131 132 var cssCommon = 133 ".kao-banner a{color:#fff;text-decoration:none;}" + 134 ".kao-banner-close{position:absolute;right:0.5rem;top:50%;transform:translateY(-50%);}"; 135 136 var style = document.createElement("style"); 137 style.textContent = 138 (size === "mini" ? cssMini : size === "minimal" ? cssMinimal : cssNormal) 139 + cssCommon; 140 document.head.appendChild(style); 141 142 // ââ Dismiss check âââââââââââââââââââââââââââââââââââââââââââââââââââââ 143 if (showClose) { 144 try { 145 var dismissed = localStorage.getItem(storageKey); 146 if (dismissed) {
147 var elapsed = Date.now() - Number(dismissed); 148 if (elapsed < dismissDays * 86400000) return; 149 localStorage.removeItem(storageKey); 150 } 151 } catch (e) {} 152 } 153 154 // ââ Create banner âââââââââââââââââââââââââââââââââââââââââââââââââââââ 155 var banner = document.createElement("div"); 156 banner.className = "kao-banner"; 157 158 var messageText = messages[locale] || messages.en; 159 160 if (linkUrl) { 161 var link = document.createElement("a"); 162 link.href = linkUrl; 163 link.target = "_blank"; 164 link.rel = "noopener"; 165 link.textContent = messageText; 166 banner.appendChild(link); 167 } else { 168 banner.appendChild(document.createTextNode(messageText)); 169 } 170 171 // Close button 172 if (showClose) { 173 var closeBtn = document.createElement("button"); 174 closeBtn.className = "kao-banner-close"; 175 closeBtn.textContent = "â"; 176 closeBtn.onclick = function () { 177 banner.style.display = "none"; 178 try { localStorage.setItem(storageKey, Date.now()); } catch (e) {} 179 }; 180 banner.appendChild(closeBtn); 181 } 182 183 // Insert banner 184 var targetId = params.id; 185 if (targetId) { 186 var target = document.getElementById(targetId); 187 if (target) target.appendChild(banner); 188 else document.body.prepend(banner); 189 } else { 190 document.body.prepend(banner); 191 } 192 193})();
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.