1 2/** 3 * Base64 ç±» 4 * æä¾ç¼ç åè§£ç Base64 çæ¹æ³ 5 */ 6function Base64() { 7 // private property 8 _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 9 // _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; 10 // public method for encoding 11 this.encode = function (input) { 12 var output = ""; 13 var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 14 var i = 0; 15 input = _utf8_encode(input); 16 while (i < input.length) { 17 chr1 = input.charCodeAt(i++); 18 chr2 = input.charCodeAt(i++); 19 chr3 = input.charCodeAt(i++); 20 enc1 = chr1 >> 2; 21 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 22 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 23 enc4 = chr3 & 63; 24 if (isNaN(chr2)) { 25 enc3 = enc4 = 64; 26 } else if (isNaN(chr3)) { 27 enc4 = 64; 28 } 29 output = output + 30 _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + 31 _keyStr.charAt(enc3) + _keyStr.charAt(enc4); 32 } 33 return output; 34 } 35 // public method for decoding 36 this.decode = function (input) { 37 var output = ""; 38 var chr1, chr2, chr3; 39 var enc1, enc2, enc3, enc4; 40 var i = 0; 41 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 42 while (i < input.length) { 43 enc1 = _keyStr.indexOf(input.charAt(i++)); 44 enc2 = _keyStr.indexOf(input.charAt(i++)); 45 enc3 = _keyStr.indexOf(input.charAt(i++)); 46 enc4 = _keyStr.indexOf(input.charAt(i++)); 47 chr1 = (enc1 << 2) | (enc2 >> 4); 48 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 49 chr3 = ((enc3 & 3) << 6) | enc4; 50 output = output + String.fromCharCode(chr1); 51 if (enc3 != 64) { 52 output = output + String.fromCharCode(chr2); 53 } 54 if (enc4 != 64) { 55 output = output + String.fromCharCode(chr3); 56 } 57 } 58 output = _utf8_decode(output); 59 return output; 60 } 61 // private method for UTF-8 encoding 62 _utf8_encode = function (string) { 63 string = string.replace(/\r\n/g, "\n"); 64 var utftext = ""; 65 for (var n = 0; n < string.length; n++) { 66 var c = string.charCodeAt(n); 67 if (c < 128) { 68 utftext += String.fromCharCode(c); 69 } else if ((c > 127) && (c < 2048)) { 70 utftext += String.fromCharCode((c >> 6) | 192); 71 utftext += String.fromCharCode((c & 63) | 128); 72 } else { 73 utftext += String.fromCharCode((c >> 12) | 224); 74 utftext += String.fromCharCode(((c >> 6) & 63) | 128); 75 utftext += String.fromCharCode((c & 63) | 128); 76 } 77 78 } 79 return utftext; 80 } 81 // private method for UTF-8 decoding 82 _utf8_decode = function (utftext) { 83 var string = ""; 84 var i = 0; 85 var c = c1 = c2 = 0; 86 while (i < utftext.length) { 87 c = utftext.charCodeAt(i); 88 if (c < 128) { 89 string += String.fromCharCode(c); 90 i++; 91 } else if ((c > 191) && (c < 224)) { 92 c2 = utftext.charCodeAt(i + 1); 93 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 94 i += 2; 95 } else { 96 c2 = utftext.charCodeAt(i + 1); 97 c3 = utftext.charCodeAt(i + 2); 98 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 99 i += 3; 100 } 101 } 102 return string; 103 } 104} 105 106/* 107 * JavaScript base64 / base64url encoder and decoder 108 */ 109 110var b64c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" // base64 dictionary 111var b64u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" // base64url dictionary 112var b64pad = '=' 113 114/* 115 * base64_encode_data 116 * å é¨å©æï¼å°æ°æ®ç¼ç 为 base64ï¼ä½¿ç¨æå®çåå ¸ã 117 */ 118function base64_encode_data(data, len, b64x) { 119 var dst = "" 120 var i 121 122 for (i = 0; i <= len - 3; i += 3) { 123 dst += b64x.charAt(data.charCodeAt(i) >>> 2) 124 dst += b64x.charAt(((data.charCodeAt(i) & 3) << 4) | (data.charCodeAt(i + 1) >>> 4)) 125 dst += b64x.charAt(((data.charCodeAt(i + 1) & 15) << 2) | (data.charCodeAt(i + 2) >>> 6)) 126 dst += b64x.charAt(data.charCodeAt(i + 2) & 63) 127 } 128 129 if (len % 3 == 2) { 130 dst += b64x.charAt(data.charCodeAt(i) >>> 2) 131 dst += b64x.charAt(((data.charCodeAt(i) & 3) << 4) | (data.charCodeAt(i + 1) >>> 4)) 132 dst += b64x.charAt(((data.charCodeAt(i + 1) & 15) << 2)) 133 dst += b64pad 134 } 135 else if (len % 3 == 1) { 136 dst += b64x.charAt(data.charCodeAt(i) >>> 2) 137 dst += b64x.charAt(((data.charCodeAt(i) & 3) << 4)) 138 dst += b64pad 139 dst += b64pad 140 } 141 142 return dst 143} 144
145/* 146 * base64_encode 147 * å° JavaScript å符串ç¼ç 为 base64ã 148 * æå®çå符串é¦å ä» JavaScript UCS-2 转æ¢ä¸º UTF-8ã 149 */ 150function base64_encode(str) { 151 var utf8str = unescape(encodeURIComponent(str)) 152 return base64_encode_data(utf8str, utf8str.length, b64c) 153} 154 155/* 156 * base64url_encode 157 * å° JavaScript å符串ç¼ç 为 base64urlã 158 * æå®çå符串é¦å ä» JavaScript UCS-2 转æ¢ä¸º UTF-8ã 159 */ 160function base64url_encode(str) { 161 var utf8str = unescape(encodeURIComponent(str)) 162 return base64_encode_data(utf8str, utf8str.length, b64u) 163} 164 165/* 166 * base64_charIndex 167 * å é¨å©æï¼å° base64 å符转æ¢ä¸ºå ¶æ´æ°ç´¢å¼ã 168 */ 169function base64_charIndex(c) { 170 if (c == "+") return 62 171 if (c == "/") return 63 172 return b64u.indexOf(c) 173} 174 175/* 176 * base64_decode 177 * å° base64 æ base64url å符串解ç 为 JavaScript å符串ã 178 * è¾å ¥åå®ä¸ºä»¥ base64/base64url ç¼ç ç UTF-8 å符串ã 179 * è¿åç»ææ¯ JavaScript (UCS-2) å符串ã 180 */ 181function base64_decode(data) { 182 var dst = "" 183 var i, a, b, c, d, z 184 185 for (i = 0; i < data.length - 3; i += 4) { 186 a = base64_charIndex(data.charAt(i + 0)) 187 b = base64_charIndex(data.charAt(i + 1)) 188 c = base64_charIndex(data.charAt(i + 2)) 189 d = base64_charIndex(data.charAt(i + 3)) 190 191 dst += String.fromCharCode((a << 2) | (b >>> 4)) 192 if (data.charAt(i + 2) != b64pad) 193 dst += String.fromCharCode(((b << 4) & 0xF0) | ((c >>> 2) & 0x0F)) 194 if (data.charAt(i + 3) != b64pad) 195 dst += String.fromCharCode(((c << 6) & 0xC0) | d) 196 } 197 198 dst = decodeURIComponent(escape(dst)) 199 return dst 200} 201 202/* 203 * base64url_sniff 204 * æ£æ¥æå®ç base64 å符串æ¯å¦å å« base64url ç¹å®å符ã 205 * 妿æå®çåç¬¦ä¸²æ¯ base64url ç¼ç ï¼åè¿å trueï¼å¦åè¿å falseã 206 */ 207function base64url_sniff(base64) { 208 if (base64.indexOf("-") >= 0) return true 209 if (base64.indexOf("_") >= 0) return true 210 return false 211} 212 213/** 214 * è·åæµè§å¨æçº¹ 215 * éè¿æ¶éç¨æ·ä»£çãå±å¹å辨çãæ¶åºåç§»çä¿¡æ¯çææçº¹ 216 */ 217function finger() { 218 // è·åæµè§å¨ User Agent ä¿¡æ¯ 219 var userAgent = navigator.userAgent; 220 221 // è·åæµè§å¨ Accept Headers ä¿¡æ¯ 222 var acceptHeaders = navigator.acceptHeader; 223 224 // è·åå±å¹å辨ç 225 var screenWidth = screen.width; 226 var screenHeight = screen.height; 227 228 // è·åæ¶åºåç§»é 229 var timezoneOffset = new Date().getTimezoneOffset(); 230 231 // å建ä¸ä¸ª Canvas å ç´ 232 var canvas = document.createElement('canvas'); 233 var ctx = canvas.getContext('2d'); 234 235 // ç»å¶ä¸ä¸ªå¾åï¼å¹¶è·åå¾åæ°æ®çåå¸å¼ 236 var text = 'fingerprint'; 237 ctx.textBaseline = "top"; 238 ctx.font = "14px 'Arial'"; 239 ctx.textBaseline = "alphabetic"; 240 ctx.fillStyle = "#f60"; 241 ctx.fillRect(125, 1, 62, 20); 242 ctx.fillStyle = "#069"; 243 ctx.fillText(text, 2, 15); 244 ctx.fillStyle = "rgba(102, 204, 0, 0.7)"; 245 ctx.fillText(text, 4, 17); 246 247 var canvasData = canvas.toDataURL(); 248 var canvasHash = hash(canvasData); 249 250 // è·åæ¬å° IP å°åå端å£å· 251 var rtcPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 252 if (rtcPeerConnection) { 253 var pc = new rtcPeerConnection({ 254 iceServers: [] 255 }); 256 pc.createDataChannel(""); 257 pc.createOffer(function (result) { 258 pc.setLocalDescription(result, function () { }, function () { }); 259 }, function () { }); 260 pc.onicecandidate = function (event) { 261 if (event && event.candidate && event.candidate.candidate) { 262 var address = event.candidate.candidate.split(' ')[4]; 263 var port = event.candidate.candidate.split(' ')[5]; 264 var ip = address.split(':')[0]; 265 266 } 267 }; 268 } 269 270 // æ´åä¸è¿°ä¿¡æ¯çææµè§å¨æçº¹ 271 var fingerprint = userAgent + acceptHeaders + screenWidth + screenHeight + timezoneOffset + canvasHash; 272 273 // 计ç®åå¸å¼ 274 function hash(str) { 275 var hash = 0; 276 for (var i = 0; i < str.length; i++) { 277 var char = str.charCodeAt(i); 278 hash = ((hash << 5) - hash) + char; 279 hash = hash & hash; 280 } 281 return hash; 282 } 283 return CryptoJS.MD5(fingerprint).toString(); 284} 285 286/** 287 * 页é¢éå®å 288 * æ ¹æ®è®¾å¤ç±»å夿æ¯å¦éå®åå°ç§»å¨ç«ç¹ 289 */ 290var browserInfo = new Browser(); 291if (typeof mSiteLink !== 'undefined') { 292 if ((browserInfo.device && browserInfo.device.toLocaleLowerCase() == 'mobile') 293 || (browserInfo.device && browserInfo.device.toLocaleLowerCase() == 'tablet')) { 294 location.href = mSiteLink; 295 } 296} 297 298function setUserCookie() { 299 // 夿æ¬å°åå¨ä¸æ¯å¦åå¨ç¨æ·æçº¹ 300 var userLocal = localStorage.getItem("browser_id"); 301 302 // 夿æ¯å¦åå¨ 303 if (!userLocal) { 304 var browser_id = finger(); // è·åæçº¹ 305 306 // è®°å½ç¨æ·æçº¹ 307 if (browser_id) { 308 // å°browser_idåå ¥localstorage 309 localStorage.setItem("browser_id", browser_id); 310 } 311 } 312} 313 314// è°ç¨æ¹æ³ 315setUserCookie();
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.