1<!DOCTYPE html> 2 <html dir="ltr" lang="en-US" prefix="og: https://ogp.me/ns#"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <title>Log In ‹ Lifespan Research Institute — WordPress</title> 6 <style type="text/css"> 7 body #login h1 a, body.login h1 a { 8 width: 300px; 9 margin: auto !important; 10 height: 115px; 11 background: url("/wp-content/uploads/2020/09/lifespan-logo-2020-md.png") no-repeat !important; 12 background-size: 300px auto !important; 13 } 14 </style> 15<meta name='robots' content='max-image-preview:large, noindex, noarchive' />
16<script type="text/javascript"> 17 window._nslDOMReady = (function () { 18 const executedCallbacks = new Set(); 19 20 return function (callback) { 21 /** 22 * Third parties might dispatch DOMContentLoaded events, so we need to ensure that we only run our callback once! 23 */ 24 if (executedCallbacks.has(callback)) return; 25 26 const wrappedCallback = function () { 27 if (executedCallbacks.has(callback)) return; 28 executedCallbacks.add(callback); 29 callback(); 30 }; 31 32 if (document.readyState === "complete" || document.readyState === "interactive") { 33 wrappedCallback(); 34 } else { 35 document.addEventListener("DOMContentLoaded", wrappedCallback); 36 } 37 }; 38 })(); 39 </script>
39<link rel='stylesheet' id='formidable-css' href='https://lifespan.io/wp-content/plugins/formidable/css/formidableforms.css?ver=9181346' type='text/css' media='all' /> 40<link rel='stylesheet' id='dashicons-css' href='https://lifespan.io/wp-includes/css/dashicons.min.css?ver=6.9' type='text/css' media='all' /> 41<link rel='stylesheet' id='buttons-css' href='https://lifespan.io/wp-includes/css/buttons.min.css?ver=6.9' type='text/css' media='all' /> 42<link rel='stylesheet' id='forms-css' href='https://lifespan.io/wp-admin/css/forms.min.css?ver=6.9' type='text/css' media='all' /> 43<link rel='stylesheet' id='l10n-css' href='https://lifespan.io/wp-admin/css/l10n.min.css?ver=6.9' type='text/css' media='all' /> 44<link rel='stylesheet' id='login-css' href='https://lifespan.io/wp-admin/css/login.min.css?ver=6.9' type='text/css' media='all' /> 45 <style type="text/css">� #login h1 a {� background-image: url("/wp-content/uploads/2014/06/[email protected]");� margin: 0 0 0 8px;� width: 500px; 46 height: 160px; 47 background-size: 500px 160px; 48 }� </style>� 49<style type="text/css"> 50#login h1 a { 51 background-size: 260px auto!important; 52 width: 260px; 53 margin: auto!important; 54 height: 115px; 55} 56</style> <meta name='referrer' content='strict-origin-when-cross-origin' /> 57 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 58 <link rel="icon" href="https://lifespan.io/wp-content/uploads/2025/11/cropped-LRI_Square-32x32.webp" sizes="32x32" /> 59<link rel="icon" href="https://lifespan.io/wp-content/uploads/2025/11/cropped-LRI_Square-192x192.webp" sizes="192x192" /> 60<link rel="apple-touch-icon" href="https://lifespan.io/wp-content/uploads/2025/11/cropped-LRI_Square-180x180.webp" /> 61<meta name="msapplication-TileImage" content="https://lifespan.io/wp-content/uploads/2025/11/cropped-LRI_Square-270x270.webp" /> 62<style type="text/css">div.nsl-container[data-align="left"] { 63 text-align: left; 64} 65 66div.nsl-container[data-align="center"] { 67 text-align: center; 68} 69 70div.nsl-container[data-align="right"] { 71 text-align: right; 72} 73 74 75div.nsl-container div.nsl-container-buttons a[data-plugin="nsl"] { 76 text-decoration: none; 77 box-shadow: none; 78 border: 0; 79} 80 81div.nsl-container .nsl-container-buttons { 82 display: flex; 83 padding: 5px 0; 84} 85 86div.nsl-container.nsl-container-block .nsl-container-buttons { 87 display: inline-grid; 88 grid-template-columns: minmax(145px, auto); 89} 90 91div.nsl-container-block-fullwidth .nsl-container-buttons { 92 flex-flow: column; 93 align-items: center; 94} 95 96div.nsl-container-block-fullwidth .nsl-container-buttons a, 97div.nsl-container-block .nsl-container-buttons a { 98 flex: 1 1 auto; 99 display: block; 100 margin: 5px 0; 101 width: 100%; 102} 103 104div.nsl-container-inline { 105 margin: -5px; 106 text-align: left; 107} 108 109div.nsl-container-inline .nsl-container-buttons { 110 justify-content: center; 111 flex-wrap: wrap; 112} 113 114div.nsl-container-inline .nsl-container-buttons a { 115 margin: 5px; 116 display: inline-block; 117} 118 119div.nsl-container-grid .nsl-container-buttons { 120 flex-flow: row; 121 align-items: center; 122 flex-wrap: wrap; 123} 124 125div.nsl-container-grid .nsl-container-buttons a { 126 flex: 1 1 auto; 127 display: block; 128 margin: 5px; 129 max-width: 280px; 130 width: 100%; 131} 132 133@media only screen and (min-width: 650px) { 134 div.nsl-container-grid .nsl-container-buttons a { 135 width: auto; 136 } 137} 138 139div.nsl-container .nsl-button { 140 cursor: pointer; 141 vertical-align: top; 142 border-radius: 4px; 143} 144 145div.nsl-container .nsl-button-default { 146 color: #fff; 147 display: flex; 148} 149 150div.nsl-container .nsl-button-icon { 151 display: inline-block; 152} 153 154div.nsl-container .nsl-button-svg-container { 155 flex: 0 0 auto; 156 padding: 8px; 157 display: flex; 158 align-items: center; 159} 160 161div.nsl-container svg { 162 height: 24px; 163 width: 24px; 164 vertical-align: top; 165} 166 167div.nsl-container .nsl-button-default div.nsl-button-label-container { 168 margin: 0 24px 0 12px; 169 padding: 10px 0; 170 font-family: Helvetica, Arial, sans-serif; 171 font-size: 16px; 172 line-height: 20px; 173 letter-spacing: .25px; 174 overflow: hidden; 175 text-align: center; 176 text-overflow: clip; 177 white-space: nowrap; 178 flex: 1 1 auto; 179 -webkit-font-smoothing: antialiased; 180 -moz-osx-font-smoothing: grayscale; 181 text-transform: none; 182 display: inline-block; 183} 184 185div.nsl-container .nsl-button-google[data-skin="light"] { 186 box-shadow: inset 0 0 0 1px #747775; 187 color: #1f1f1f; 188} 189 190div.nsl-container .nsl-button-google[data-skin="dark"] { 191 box-shadow: inset 0 0 0 1px #8E918F; 192 color: #E3E3E3; 193} 194 195div.nsl-container .nsl-button-google[data-skin="neutral"] { 196 color: #1F1F1F; 197} 198 199div.nsl-container .nsl-button-google div.nsl-button-label-container { 200 font-family: "Roboto Medium", Roboto, Helvetica, Arial, sans-serif; 201} 202 203div.nsl-container .nsl-button-apple .nsl-button-svg-container { 204 padding: 0 6px; 205} 206 207div.nsl-container .nsl-button-apple .nsl-button-svg-container svg { 208 height: 40px; 209 width: auto; 210} 211 212div.nsl-container .nsl-button-apple[data-skin="light"] { 213 color: #000; 214 box-shadow: 0 0 0 1px #000; 215} 216 217div.nsl-container .nsl-button-facebook[data-skin="white"] { 218 color: #000; 219 box-shadow: inset 0 0 0 1px #000; 220} 221 222div.nsl-container .nsl-button-facebook[data-skin="light"] { 223 color: #1877F2; 224 box-shadow: inset 0 0 0 1px #1877F2; 225} 226 227div.nsl-container .nsl-button-spotify[data-skin="white"] { 228 color: #191414; 229 box-shadow: inset 0 0 0 1px #191414; 230} 231 232div.nsl-container .nsl-button-apple div.nsl-button-label-container { 233 font-size: 17px; 234 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 235} 236 237div.nsl-container .nsl-button-slack div.nsl-button-label-container { 238 font-size: 17px; 239 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 240} 241 242div.nsl-container .nsl-button-slack[data-skin="light"] { 243 color: #000000; 244 box-shadow: inset 0 0 0 1px #DDDDDD; 245} 246 247div.nsl-container .nsl-button-tiktok[data-skin="light"] { 248 color: #161823; 249 box-shadow: 0 0 0 1px rgba(22, 24, 35, 0.12); 250} 251 252 253div.nsl-container .nsl-button-kakao { 254 color: rgba(0, 0, 0, 0.85); 255} 256 257.nsl-clear { 258 clear: both; 259} 260 261.nsl-container { 262 clear: both; 263} 264 265.nsl-disabled-provider .nsl-button { 266 filter: grayscale(1); 267 opacity: 0.8; 268} 269 270/*Button align start*/ 271 272div.nsl-container-inline[data-align="left"] .nsl-container-buttons { 273 justify-content: flex-start; 274} 275 276div.nsl-container-inline[data-align="center"] .nsl-container-buttons { 277 justify-content: center; 278} 279 280div.nsl-container-inline[data-align="right"] .nsl-container-buttons { 281 justify-content: flex-end; 282} 283 284 285div.nsl-container-grid[data-align="left"] .nsl-container-buttons { 286 justify-content: flex-start; 287} 288 289div.nsl-container-grid[data-align="center"] .nsl-container-buttons { 290 justify-content: center; 291} 292 293div.nsl-container-grid[data-align="right"] .nsl-container-buttons { 294 justify-content: flex-end; 295} 296 297div.nsl-container-grid[data-align="space-around"] .nsl-container-buttons { 298 justify-content: space-around; 299} 300 301div.nsl-container-grid[data-align="space-between"] .nsl-container-buttons { 302 justify-content: space-between; 303} 304 305/* Button align end*/ 306 307/* Redirect */ 308 309#nsl-redirect-overlay { 310 display: flex; 311 flex-direction: column; 312 justify-content: center;
313 align-items: center; 314 position: fixed; 315 z-index: 1000000; 316 left: 0; 317 top: 0; 318 width: 100%; 319 height: 100%; 320 backdrop-filter: blur(1px); 321 background-color: RGBA(0, 0, 0, .32);; 322} 323 324#nsl-redirect-overlay-container { 325 display: flex; 326 flex-direction: column; 327 justify-content: center; 328 align-items: center; 329 background-color: white; 330 padding: 30px; 331 border-radius: 10px; 332} 333 334#nsl-redirect-overlay-spinner { 335 content: ''; 336 display: block; 337 margin: 20px; 338 border: 9px solid RGBA(0, 0, 0, .6); 339 border-top: 9px solid #fff; 340 border-radius: 50%; 341 box-shadow: inset 0 0 0 1px RGBA(0, 0, 0, .6), 0 0 0 1px RGBA(0, 0, 0, .6); 342 width: 40px; 343 height: 40px; 344 animation: nsl-loader-spin 2s linear infinite; 345} 346 347@keyframes nsl-loader-spin { 348 0% { 349 transform: rotate(0deg) 350 } 351 to { 352 transform: rotate(360deg) 353 } 354} 355 356#nsl-redirect-overlay-title { 357 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 358 font-size: 18px; 359 font-weight: bold; 360 color: #3C434A; 361} 362 363#nsl-redirect-overlay-text { 364 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 365 text-align: center; 366 font-size: 14px; 367 color: #3C434A; 368} 369 370/* Redirect END*/</style><style type="text/css">/* Notice fallback */ 371#nsl-notices-fallback { 372 position: fixed; 373 right: 10px; 374 top: 10px; 375 z-index: 10000; 376} 377 378.admin-bar #nsl-notices-fallback { 379 top: 42px; 380} 381 382#nsl-notices-fallback > div { 383 position: relative; 384 background: #fff; 385 border-left: 4px solid #fff; 386 box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); 387 margin: 5px 15px 2px; 388 padding: 1px 20px; 389} 390 391#nsl-notices-fallback > div.error { 392 display: block; 393 border-left-color: #dc3232; 394} 395 396#nsl-notices-fallback > div.updated { 397 display: block; 398 border-left-color: #46b450; 399} 400 401#nsl-notices-fallback p { 402 margin: .5em 0; 403 padding: 2px; 404} 405 406#nsl-notices-fallback > div:after { 407 position: absolute; 408 right: 5px; 409 top: 5px; 410 content: '\00d7'; 411 display: block; 412 height: 16px; 413 width: 16px; 414 line-height: 16px; 415 text-align: center; 416 font-size: 20px; 417 cursor: pointer; 418}</style> </head> 419 <body class="login no-js login-action-login wp-core-ui locale-en-us"> 420
420<script type="text/javascript"> 421/* <![CDATA[ */ 422document.body.className = document.body.className.replace('no-js','js'); 423/* ]]> */ 424</script>
424 425 426 <h1 class="screen-reader-text">Log In</h1> 427 <div id="login"> 428 <h1 role="presentation" class="wp-login-logo"><a href="https://lifespan.io">Lifespan Research Institute</a></h1> 429 430 <form name="loginform" id="loginform" action="https://lifespan.io/wp-login.php" method="post"> 431 <p> 432 <label for="user_login">Username or Email Address</label> 433 <input type="text" name="log" id="user_login" class="input" value="" size="20" autocapitalize="off" autocomplete="username" required="required" /> 434 </p> 435 436 <div class="user-pass-wrap"> 437 <label for="user_pass">Password</label> 438 <div class="wp-pwd"> 439 <input type="password" name="pwd" id="user_pass" class="input password-input" value="" size="20" autocomplete="current-password" spellcheck="false" required="required" /> 440 <button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="Show password"> 441 <span class="dashicons dashicons-visibility" aria-hidden="true"></span> 442 </button> 443 </div> 444 </div> 445 <div id="nsl-custom-login-form-main"><div class="nsl-container nsl-container-block" data-align="left"><div class="nsl-container-buttons"><a href="https://lifespan.io/wp-login.php?loginSocial=facebook" rel="nofollow" aria-label="Continue with <b>Facebook</b>" data-plugin="nsl" data-action="connect" data-provider="facebook" data-popupwidth="600" data-popupheight="679" data-e-disable-page-transition="1"><div class="nsl-button nsl-button-default nsl-button-facebook" data-skin="dark" style="background-color:#1877F2;"><div class="nsl-button-svg-container"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1365.3 1365.3" height="24" width="24"><path d="M1365.3 682.7A682.7 682.7 0 10576 1357V880H402.7V682.7H576V532.3c0-171.1 102-265.6 257.9-265.6 74.6 0 152.8 13.3 152.8 13.3v168h-86.1c-84.8 0-111.3 52.6-111.3 106.6v128h189.4L948.4 880h-159v477a682.8 682.8 0 00576-674.3" fill="#fff"/></svg></div><div class="nsl-button-label-container">Continue with <b>Facebook</b></div></div></a><a href="https://lifespan.io/wp-login.php?loginSocial=twitter" rel="nofollow" aria-label="Continue with <b>Twitter</b>" data-plugin="nsl" data-action="connect" data-provider="twitter" data-popupwidth="600" data-popupheight="600" data-e-disable-page-transition="1"><div class="nsl-button nsl-button-default nsl-button-twitter" data-skin="x" style="background-color:#000000;"><div class="nsl-button-svg-container"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13.712 10.622 20.413 3h-1.587l-5.819 6.618L8.36 3H3l7.027 10.007L3 21h1.588l6.144-6.989L15.64 21H21l-7.288-10.378Zm-2.175 2.474-.712-.997L5.16 4.17H7.6l4.571 6.4.712.996 5.943 8.319h-2.439l-4.85-6.788Z" fill="#fff"/><defs><path fill="#fff" d="M0 0h24v24H0z"/></defs></svg></div><div class="nsl-button-label-container">Continue with <b>Twitter</b></div></div></a></div></div></div>
445<script type="text/javascript"> 446 window._nslDOMReady(function () { 447 var container = document.getElementById('nsl-custom-login-form-main'), 448 form = document.querySelector('#loginform,#registerform,#front-login-form,#setupform'); 449 450 if (!form) { 451 form = container.closest('form'); 452 if (!form) { 453 form = container.parentNode; 454 } 455 } 456 457 var innerContainer = container.querySelector('.nsl-container'); 458 if (innerContainer) { 459 innerContainer.classList.add('nsl-container-login-layout-below'); 460 innerContainer.style.display = 'block'; 461 } 462 463 var jetpackSSO = document.getElementById('jetpack-sso-wrap'); 464 if (jetpackSSO) { 465 form = jetpackSSO; 466 } else { 467 if (form.parentNode.classList.contains('tml')) { 468 form = form.parentNode; 469 } 470 } 471 472 form.appendChild(container); 473 474 }); 475</script>
475 476<style type="text/css"> 477 #nsl-custom-login-form-main .nsl-container { 478 display: none; 479 } 480 481 #nsl-custom-login-form-main .nsl-container-login-layout-below { 482 clear: both; 483 padding: 20px 0 0; 484 } 485 486 .login form { 487 padding-bottom: 20px; 488 } 489 490 #nsl-custom-login-form-jetpack-sso .nsl-container-login-layout-below { 491 clear: both; 492 padding: 0 0 20px; 493 } 494</style> <p class="forgetmenot"><input name="rememberme" type="checkbox" id="rememberme" value="forever" /> <label for="rememberme">Remember Me</label></p> 495 <p class="submit"> 496 <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="Log In" /> 497 <input type="hidden" name="redirect_to" value="https://lifespan.io/wp-admin/" /> 498 <input type="hidden" name="testcookie" value="1" /> 499 </p> 500 </form> 501 502 <p id="nav"> 503 <a class="wp-login-register" href="https://lifespan.io/wp-login.php?action=register">Register</a> | <a class="wp-login-lost-password" href="https://lifespan.io/reset-password/">Lost your password?</a> </p> 504
504<script type="text/javascript"> 505/* <![CDATA[ */ 506function wp_attempt_focus() {setTimeout( function() {try {d = document.getElementById( "user_login" );d.focus(); d.select();} catch( er ) {}}, 200);} 507wp_attempt_focus(); 508if ( typeof wpOnload === 'function' ) { wpOnload() } 509/* ]]> */ 510</script>
510 511 <p id="backtoblog"> 512 <a href="https://lifespan.io/">← Go to Lifespan Research Institute</a> </p> 513 </div> 514 515
515<script type="text/javascript" src="https://lifespan.io/wp-includes/js/clipboard.min.js?ver=2.0.11" id="clipboard-js"></script>
vendor: 1 bytes, line 515
515
516<script type="text/javascript" src="https://lifespan.io/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
vendor: 1 bytes, line 516
516
517<script type="text/javascript" src="https://lifespan.io/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
vendor: 1 bytes, line 517
517
518<script type="text/javascript" id="zxcvbn-async-js-extra"> 519/* <![CDATA[ */ 520var _zxcvbnSettings = {"src":"https://lifespan.io/wp-includes/js/zxcvbn.min.js"}; 521//# sourceURL=zxcvbn-async-js-extra 522/* ]]> */ 523</script>
vendor: 1 bytes, line 523
523
524<script type="text/javascript" src="https://lifespan.io/wp-includes/js/zxcvbn-async.min.js?ver=1.0" id="zxcvbn-async-js"></script>
vendor: 1 bytes, line 524
524
525<script type="text/javascript" src="https://lifespan.io/wp-includes/js/dist/hooks.min.js?ver=dd5603f07f9220ed27f1" id="wp-hooks-js"></script>
vendor: 1 bytes, line 525
525
526<script type="text/javascript" src="https://lifespan.io/wp-includes/js/dist/i18n.min.js?ver=c26c3dc7bed366793375" id="wp-i18n-js"></script>
vendor: 1 bytes, line 526
526
527<script type="text/javascript" id="wp-i18n-js-after"> 528/* <![CDATA[ */ 529wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 530//# sourceURL=wp-i18n-js-after 531/* ]]> */ 532</script>
vendor: 1 bytes, line 532
532
533<script type="text/javascript" id="password-strength-meter-js-extra"> 534/* <![CDATA[ */ 535var pwsL10n = {"unknown":"Password strength unknown","short":"Very weak","bad":"Weak","good":"Medium","strong":"Strong","mismatch":"Mismatch"}; 536//# sourceURL=password-strength-meter-js-extra 537/* ]]> */ 538</script>
vendor: 1 bytes, line 538
538
539<script type="text/javascript" src="https://lifespan.io/wp-admin/js/password-strength-meter.min.js?ver=6.9" id="password-strength-meter-js"></script>
vendor: 1 bytes, line 539
539
540<script src='https://lifespan.io/wp-content/plugins/event-tickets/common/build/js/underscore-before.js'></script>
vendor: 1 bytes, line 540
540
541<script type="text/javascript" src="https://lifespan.io/wp-includes/js/underscore.min.js?ver=1.13.7" id="underscore-js"></script>
vendor: 1 bytes, line 541
541
542<script src='https://lifespan.io/wp-content/plugins/event-tickets/common/build/js/underscore-after.js'></script>
vendor: 1 bytes, line 542
542
543<script type="text/javascript" id="wp-util-js-extra"> 544/* <![CDATA[ */ 545var _wpUtilSettings = {"ajax":{"url":"/wp-admin/admin-ajax.php"}}; 546//# sourceURL=wp-util-js-extra 547/* ]]> */ 548</script>
vendor: 1 bytes, line 548
548
549<script type="text/javascript" src="https://lifespan.io/wp-includes/js/wp-util.min.js?ver=6.9" id="wp-util-js"></script>
vendor: 1 bytes, line 549
549
550<script type="text/javascript" src="https://lifespan.io/wp-includes/js/dist/dom-ready.min.js?ver=f77871ff7694fffea381" id="wp-dom-ready-js"></script>
vendor: 1 bytes, line 550
550
551<script type="text/javascript" src="https://lifespan.io/wp-includes/js/dist/a11y.min.js?ver=cb460b4676c94bd228ed" id="wp-a11y-js"></script>
vendor: 1 bytes, line 551
551
552<script type="text/javascript" id="user-profile-js-extra"> 553/* <![CDATA[ */ 554var userProfileL10n = {"user_id":"0","nonce":"0bfe360d3b"}; 555//# sourceURL=user-profile-js-extra 556/* ]]> */ 557</script>
vendor: 1 bytes, line 557
557
558<script type="text/javascript" src="https://lifespan.io/wp-admin/js/user-profile.min.js?ver=6.9" id="user-profile-js"></script>
vendor: 1 bytes, line 558
558
559<script type="text/javascript">(function (undefined) {let scriptOptions={"_localizedStrings":{"redirect_overlay_title":"Hold On","redirect_overlay_text":"You are being redirected to another page,<br>it may take a few seconds.","webview_notification_text":"The selected provider doesn't support embedded browsers!"},"_targetWindow":"prefer-popup","_redirectOverlay":"overlay-with-spinner-and-message","_unsupportedWebviewBehavior":""}; 560/** 561 * Used when Cross-Origin-Opener-Policy blocked the access to the opener. We can't have a reference of the opened windows, so we should attempt to refresh only the windows that has opened popups. 562 */ 563window._nslHasOpenedPopup = false; 564window._nslWebViewNoticeElement = null; 565 566window.NSLPopup = function (url, title, w, h) { 567 568 /** 569 * Cross-Origin-Opener-Policy blocked the access to the opener 570 */ 571 if (typeof BroadcastChannel === "function") { 572 const _nslLoginBroadCastChannel = new BroadcastChannel('nsl_login_broadcast_channel'); 573 _nslLoginBroadCastChannel.onmessage = (event) => { 574 if (window?._nslHasOpenedPopup && event.data?.action === 'redirect') { 575 window._nslHasOpenedPopup = false; 576 577 const url = event.data?.href; 578 _nslLoginBroadCastChannel.close(); 579 if (typeof window.nslRedirect === 'function') { 580 window.nslRedirect(url); 581 } else { 582 window.opener.location = url; 583 } 584 } 585 }; 586 } 587 588 const userAgent = navigator.userAgent, 589 mobile = function () { 590 return /\b(iPhone|iP[ao]d)/.test(userAgent) || 591 /\b(iP[ao]d)/.test(userAgent) || 592 /Android/i.test(userAgent) || 593 /Mobile/i.test(userAgent); 594 }, 595 screenX = window.screenX !== undefined ? window.screenX : window.screenLeft, 596 screenY = window.screenY !== undefined ? window.screenY : window.screenTop, 597 outerWidth = window.outerWidth !== undefined ? window.outerWidth : document.documentElement.clientWidth, 598 outerHeight = window.outerHeight !== undefined ? window.outerHeight : document.documentElement.clientHeight - 22, 599 targetWidth = mobile() ? null : w, 600 targetHeight = mobile() ? null : h, 601 left = parseInt(screenX + (outerWidth - targetWidth) / 2, 10), 602 right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10), 603 features = []; 604 if (targetWidth !== null) { 605 features.push('width=' + targetWidth); 606 } 607 if (targetHeight !== null) { 608 features.push('height=' + targetHeight); 609 } 610 features.push('left=' + left); 611 features.push('top=' + right); 612 features.push('scrollbars=1'); 613 614 const newWindow = window.open(url, title, features.join(',')); 615 616 if (window.focus) { 617 newWindow.focus(); 618 } 619 620 window._nslHasOpenedPopup = true; 621 622 return newWindow; 623}; 624 625let isWebView = null; 626 627function checkWebView() { 628 if (isWebView === null) { 629 function _detectOS(ua) { 630 if (/Android/.test(ua)) { 631 return "Android"; 632 } else if (/iPhone|iPad|iPod/.test(ua)) { 633 return "iOS"; 634 } else if (/Windows/.test(ua)) { 635 return "Windows"; 636 } else if (/Mac OS X/.test(ua)) { 637 return "Mac"; 638 } else if (/CrOS/.test(ua)) { 639 return "Chrome OS"; 640 } else if (/Firefox/.test(ua)) { 641 return "Firefox OS"; 642 } 643 return ""; 644 } 645 646 function _detectBrowser(ua) { 647 let android = /Android/.test(ua); 648 649 if (/Opera Mini/.test(ua) || / OPR/.test(ua) || / OPT/.test(ua)) { 650 return "Opera"; 651 } else if (/CriOS/.test(ua)) { 652 return "Chrome for iOS"; 653 } else if (/Edge/.test(ua)) { 654 return "Edge"; 655 } else if (android && /Silk\//.test(ua)) { 656 return "Silk"; 657 } else if (/Chrome/.test(ua)) { 658 return "Chrome"; 659 } else if (/Firefox/.test(ua)) { 660 return "Firefox"; 661 } else if (android) { 662 return "AOSP"; 663 } else if (/MSIE|Trident/.test(ua)) { 664 return "IE"; 665 } else if (/Safari\//.test(ua)) { 666 return "Safari"; 667 }
667 else if (/AppleWebKit/.test(ua)) { 668 return "WebKit"; 669 } 670 return ""; 671 } 672 673 function _detectBrowserVersion(ua, browser) { 674 if (browser === "Opera") { 675 return /Opera Mini/.test(ua) ? _getVersion(ua, "Opera Mini/") : 676 / OPR/.test(ua) ? _getVersion(ua, " OPR/") : 677 _getVersion(ua, " OPT/"); 678 } else if (browser === "Chrome for iOS") { 679 return _getVersion(ua, "CriOS/"); 680 } else if (browser === "Edge") { 681 return _getVersion(ua, "Edge/"); 682 } else if (browser === "Chrome") { 683 return _getVersion(ua, "Chrome/"); 684 } else if (browser === "Firefox") { 685 return _getVersion(ua, "Firefox/"); 686 } else if (browser === "Silk") { 687 return _getVersion(ua, "Silk/"); 688 } else if (browser === "AOSP") { 689 return _getVersion(ua, "Version/"); 690 } else if (browser === "IE") { 691 return /IEMobile/.test(ua) ? _getVersion(ua, "IEMobile/") : 692 /MSIE/.test(ua) ? _getVersion(ua, "MSIE ") 693 : 694 _getVersion(ua, "rv:"); 695 } else if (browser === "Safari") { 696 return _getVersion(ua, "Version/"); 697 } else if (browser === "WebKit") { 698 return _getVersion(ua, "WebKit/"); 699 } 700 return "0.0.0"; 701 } 702 703 function _getVersion(ua, token) { 704 try { 705 return _normalizeSemverString(ua.split(token)[1].trim().split(/[^\w\.]/)[0]); 706 } catch (o_O) { 707 } 708 return "0.0.0"; 709 } 710 711 function _normalizeSemverString(version) { 712 const ary = version.split(/[\._]/); 713 return (parseInt(ary[0], 10) || 0) + "." + 714 (parseInt(ary[1], 10) || 0) + "." + 715 (parseInt(ary[2], 10) || 0); 716 } 717 718 function _isWebView(ua, os, browser, version, options) { 719 switch (os + browser) { 720 case "iOSSafari": 721 return false; 722 case "iOSWebKit": 723 return _isWebView_iOS(options); 724 case "AndroidAOSP": 725 return false; 726 case "AndroidChrome": 727 return parseFloat(version) >= 42 ? /; wv/.test(ua) : /\d{2}\.0\.0/.test(version) ? true : _isWebView_Android(options); 728 } 729 return false; 730 } 731 732 function _isWebView_iOS(options) { 733 const document = (window["document"] || {}); 734 735 if ("WEB_VIEW" in options) { 736 return options["WEB_VIEW"]; 737 } 738 return !("fullscreenEnabled" in document || "webkitFullscreenEnabled" in document || false); 739 } 740 741 function _isWebView_Android(options) { 742 if ("WEB_VIEW" in options) { 743 return options["WEB_VIEW"]; 744 } 745 return !("requestFileSystem" in window || "webkitRequestFileSystem" in window || false); 746 } 747 748 const options = {}, 749 nav = window.navigator || {}, 750 ua = nav.userAgent || "", 751 os = _detectOS(ua), 752 browser = _detectBrowser(ua), 753 browserVersion = _detectBrowserVersion(ua, browser); 754 755 isWebView = _isWebView(ua, os, browser, browserVersion, options); 756 } 757 758 return isWebView; 759} 760 761function isAllowedWebViewForUserAgent(provider) { 762 const facebookAllowedWebViews = [ 763 'Instagram', 764 'FBAV', 765 'FBAN' 766 ]; 767 let whitelist = []; 768 769 if (provider && provider === 'facebook') { 770 whitelist = facebookAllowedWebViews; 771 } 772 773 const nav = window.navigator || {}, 774 ua = nav.userAgent || ""; 775 776 if (whitelist.length && ua.match(new RegExp(whitelist.join('|')))) { 777 return true; 778 } 779 780 return false; 781} 782 783function disableButtonInWebView(providerButtonElement) { 784 if (providerButtonElement) { 785 providerButtonElement.classList.add('nsl-disabled-provider'); 786 providerButtonElement.setAttribute('href', '#'); 787 788 providerButtonElement.addEventListener('pointerdown', (e) => { 789 const closeNotice = function () { 790 if (window._nslWebViewNoticeElement) { 791 window._nslWebViewNoticeElement.remove(); 792 window._nslWebViewNoticeElement = null; 793 } 794 }; 795 796 closeNotice(); 797 798 window._nslWebViewNoticeElement = document.createElement('div'); 799 window._nslWebViewNoticeElement.id = "nsl-notices-fallback"; 800 window._nslWebViewNoticeElement.role = 'alert'; 801 window._nslWebViewNoticeElement.ariaLive = 'assertive'; 802 window._nslWebViewNoticeElement.ariaAtomic = 'true'; 803 804 window._nslWebViewNoticeElement.addEventListener('pointerdown', closeNotice); 805 806 window._nslWebViewNoticeElement.addEventListener('keydown', function (e) { 807 if (e.key === 'Enter') { 808 e.preventDefault(); 809 closeNotice(); 810 } 811 }); 812 const webviewNoticeHTML = '<div class="error"><p>' + scriptOptions._localizedStrings.webview_notification_text + '</p></div>'; 813 814 window._nslWebViewNoticeElement.insertAdjacentHTML("afterbegin", webviewNoticeHTML); 815 document.body.appendChild(window._nslWebViewNoticeElement); 816 }); 817 } 818 819} 820 821window._nslDOMReady(function () { 822 823 window.nslRedirect = function (url) { 824 if (scriptOptions._redirectOverlay) {
825 const overlay = document.createElement('div'); 826 overlay.id = "nsl-redirect-overlay"; 827 let overlayHTML = ''; 828 const overlayContainer = "<div id='nsl-redirect-overlay-container'>", 829 overlayContainerClose = "</div>", 830 overlaySpinner = "<div id='nsl-redirect-overlay-spinner'></div>", 831 overlayTitle = "<p id='nsl-redirect-overlay-title'>" + scriptOptions._localizedStrings.redirect_overlay_title + "</p>", 832 overlayText = "<p id='nsl-redirect-overlay-text'>" + scriptOptions._localizedStrings.redirect_overlay_text + "</p>"; 833 834 switch (scriptOptions._redirectOverlay) { 835 case "overlay-only": 836 break; 837 case "overlay-with-spinner": 838 overlayHTML = overlayContainer + overlaySpinner + overlayContainerClose; 839 break; 840 default: 841 overlayHTML = overlayContainer + overlaySpinner + overlayTitle + overlayText + overlayContainerClose; 842 break; 843 } 844 845 overlay.insertAdjacentHTML("afterbegin", overlayHTML); 846 document.body.appendChild(overlay); 847 } 848 849 window.location = url; 850 }; 851 852 let targetWindow = scriptOptions._targetWindow || 'prefer-popup', 853 lastPopup = false; 854 855 856 document.addEventListener('click', function (e) { 857 if (e.target) { 858 const buttonLinkElement = e.target.closest('a[data-plugin="nsl"][data-action="connect"]') || e.target.closest('a[data-plugin="nsl"][data-action="link"]'); 859 if (buttonLinkElement) { 860 if (lastPopup && !lastPopup.closed) { 861 e.preventDefault(); 862 lastPopup.focus(); 863 } else { 864 865 let href = buttonLinkElement.href, 866 success = false; 867 if (href.indexOf('?') !== -1) { 868 href += '&'; 869 } else { 870 href += '?'; 871 } 872 873 const redirectTo = buttonLinkElement.dataset.redirect; 874 if (redirectTo === 'current') { 875 href += 'redirect=' + encodeURIComponent(window.location.href) + '&'; 876 } else if (redirectTo && redirectTo !== '') { 877 href += 'redirect=' + encodeURIComponent(redirectTo) + '&'; 878 } 879 880 if (targetWindow !== 'prefer-same-window' && checkWebView()) { 881 targetWindow = 'prefer-same-window'; 882 } 883 884 if (targetWindow === 'prefer-popup') { 885 lastPopup = NSLPopup(href + 'display=popup', 'nsl-social-connect', buttonLinkElement.dataset.popupwidth, buttonLinkElement.dataset.popupheight); 886 if (lastPopup) { 887 success = true; 888 e.preventDefault(); 889 } 890 } else if (targetWindow === 'prefer-new-tab') { 891 const newTab = window.open(href + 'display=popup', '_blank'); 892 if (newTab) { 893 if (window.focus) { 894 newTab.focus(); 895 } 896 success = true; 897 window._nslHasOpenedPopup = true; 898 e.preventDefault(); 899 } 900 } 901 902 if (!success) { 903 window.location = href; 904 e.preventDefault(); 905 } 906 } 907 } 908 } 909 }); 910 911 let buttonCountChanged = false; 912 913 const googleLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="google"]'); 914 if (googleLoginButtons.length && checkWebView()) { 915 googleLoginButtons.forEach(function (googleLoginButton) { 916 if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') { 917 disableButtonInWebView(googleLoginButton); 918 } else { 919 googleLoginButton.remove(); 920 buttonCountChanged = true; 921 } 922 }); 923 } 924 925 const facebookLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="facebook"]'); 926 if (facebookLoginButtons.length && checkWebView() && /Android/.test(window.navigator.userAgent) && !isAllowedWebViewForUserAgent('facebook')) { 927 facebookLoginButtons.forEach(function (facebookLoginButton) { 928 if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') { 929 disableButtonInWebView(facebookLoginButton); 930 } else { 931 facebookLoginButton.remove(); 932 buttonCountChanged = true; 933 } 934 }); 935 } 936 937 const separators = document.querySelectorAll('div.nsl-separator'); 938 if (buttonCountChanged && separators.length) {
939 separators.forEach(function (separator) { 940 const separatorParentNode = separator.parentNode; 941 if (separatorParentNode) { 942 const separatorButtonContainer = separatorParentNode.querySelector('div.nsl-container-buttons'); 943 if (separatorButtonContainer && !separatorButtonContainer.hasChildNodes()) { 944 separator.remove(); 945 } 946 } 947 }) 948 } 949});})();</script>
949 </body> 950 </html> 951
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.