1/*! This file is auto-generated */ 2window.addComment=function(v){var I,C,h,E=v.document,b={commentReplyClass:"comment-reply-link",commentReplyTitleId:"reply-title",cancelReplyId:"cancel-comment-reply-link",commentFormId:"commentform",temporaryFormId:"wp-temp-form-div",parentIdFieldId:"comment_parent",postIdFieldId:"comment_post_ID"},e=v.MutationObserver||v.WebKitMutationObserver||v.MozMutationObserver,i="querySelector"in E&&"addEventListener"in v,n=!!E.documentElement.dataset;function t(){o(),e&&new e(d).observe(E.body,{childList:!0,subtree:!0})}function o(e){if(i&&(I=g(b.cancelReplyId),C=g(b.commentFormId),I)){I.addEventListener("click",l);function t(e){if((e.metaKey||e.ctrlKey)&&13===e.keyCode&&"a"!==E.activeElement.tagName.toLowerCase())return C.removeEventListener("keydown",t),e.preventDefault(),C.submit.click(),!1}C&&C.addEventListener("keydown",t);for(var n=function(e){var t=b.commentReplyClass;e&&e.childNodes||(e=E);e=E.getElementsByClassName?e.getElementsByClassName(t):e.querySelectorAll("."+t);return e}(e),o=0,d=n.length;o<d;o++)n[o].addEventListener("click",r)}}function l(e){var t,n,o=g(b.temporaryFormId);o&&h&&(g(b.parentIdFieldId).value="0",t=o.textContent,o.parentNode.replaceChild(h,o),this.style.display="none",n=(o=(o=g(b.commentReplyTitleId))&&o.firstChild)&&o.nextSibling,o&&o.nodeType===Node.TEXT_NODE&&t&&(n&&"A"===n.nodeName&&n.id!==b.cancelReplyId&&(n.style.display=""),o.textContent=t),e.preventDefault())}function r(e){var t=g(b.commentReplyTitleId),t=t&&t.firstChild.textContent,n=this,o=a(n,"belowelement"),d=a(n,"commentid"),i=a(n,"respondelement"),l=a(n,"postid"),n=a(n,"replyto")||t;o&&d&&i&&l&&!1===v.addComment.moveForm(o,d,i,l,n)&&e.preventDefault()}function d(e){for(var t=e.length;t--;)if(e[t].addedNodes.length)return void o()}function a(e,t){return n?e.dataset[t]:e.getAttribute("data-"+t)}function g(e){return E.getElementById(e)}return i&&"loading"!==E.readyState?t():i&&v.addEventListener("DOMContentLoaded",t,!1),{init:o,moveForm:function(e,t,n,o,d){var i,l,r,a,m,c,s,e=g(e),n=(h=g(n),g(b.parentIdFieldId)),y=g(b.postIdFieldId),p=g(b.commentReplyTitleId),u=(p=p&&p.firstChild)&&p.nextSibling;if(e&&h&&n){void 0===d&&(d=p&&p.textContent),a=h,m=b.temporaryFormId,c=g(m),s=(s=g(b.commentReplyTitleId))?s.firstChild.textContent:"",c||((c=E.createElement("div")).id=m,c.style.display="none",c.textContent=s,a.parentNode.insertBefore(c,a)),o&&y&&(y.value=o),n.value=t,I.style.display="",e.parentNode.insertBefore(h,e.nextSibling),p&&p.nodeType===Node.TEXT_NODE&&(u&&"A"===u.nodeName&&u.id!==b.cancelReplyId&&(u.style.display="none"),p.textContent=d),I.onclick=function(){return!1};try{for(var f=0;f<C.elements.length;f++)if(i=C.elements[f],l=!1,"getComputedStyle"in v?r=v.getComputedStyle(i):E.documentElement.currentStyle&&(r=i.currentStyle),(i.offsetWidth<=0&&i.offsetHeight<=0||"hidden"===r.visibility)&&(l=!0),"hidden"!==i.type&&!i.disabled&&!l){i.focus();break}}catch(e){}return!1}}}}(window);; 3/*! Responsive JS Library v1.2.2 */ 4 5/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ 6/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */ 7window.matchMedia = window.matchMedia || (function(doc, undefined){ 8 9 var bool, 10 docElem = doc.documentElement, 11 refNode = docElem.firstElementChild || docElem.firstChild, 12 // fakeBody required for <FF4 when executed in <head> 13 fakeBody = doc.createElement('body'), 14 div = doc.createElement('div'); 15 16 div.id = 'mq-test-1'; 17 div.style.cssText = "position:absolute;top:-100em"; 18 fakeBody.style.background = "none"; 19 fakeBody.appendChild(div); 20 21 return function(q){ 22 23 div.innerHTML = '­<style media="'+q+'"> #mq-test-1 { width: 42px; }</style>'; 24 25 docElem.insertBefore(fakeBody, refNode); 26 bool = div.offsetWidth == 42; 27 docElem.removeChild(fakeBody); 28 29 return { matches: bool, media: q }; 30 }; 31 32})(document); 33 34/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ 35(function( win ){
36 //exposed namespace 37 win.respond = {}; 38 39 //define update even in native-mq-supporting browsers, to avoid errors 40 respond.update = function(){}; 41 42 //expose media query support flag for external use 43 respond.mediaQueriesSupported = win.matchMedia && win.matchMedia( "only all" ).matches; 44 45 //if media queries are supported, exit here 46 if( respond.mediaQueriesSupported ){ return; } 47 48 //define vars 49 var doc = win.document, 50 docElem = doc.documentElement, 51 mediastyles = [], 52 rules = [], 53 appendedEls = [], 54 parsedSheets = {}, 55 resizeThrottle = 30, 56 head = doc.getElementsByTagName( "head" )[0] || docElem, 57 base = doc.getElementsByTagName( "base" )[0], 58 links = head.getElementsByTagName( "link" ), 59 requestQueue = [], 60 61 //loop stylesheets, send text content to translate 62 ripCSS = function(){ 63 var sheets = links, 64 sl = sheets.length, 65 i = 0, 66 //vars for loop: 67 sheet, href, media, isCSS; 68 69 for( ; i < sl; i++ ){ 70 sheet = sheets[ i ], 71 href = sheet.href, 72 media = sheet.media, 73 isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; 74 75 //only links plz and prevent re-parsing 76 if( !!href && isCSS && !parsedSheets[ href ] ){ 77 // selectivizr exposes css through the rawCssText expando 78 if (sheet.styleSheet && sheet.styleSheet.rawCssText) { 79 translate( sheet.styleSheet.rawCssText, href, media ); 80 parsedSheets[ href ] = true; 81 } else { 82 if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) 83 || href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){ 84 requestQueue.push( { 85 href: href, 86 media: media 87 } ); 88 } 89 } 90 } 91 } 92 makeRequests(); 93 }, 94 95 //recurse through request queue, get css text 96 makeRequests = function(){ 97 if( requestQueue.length ){ 98 var thisRequest = requestQueue.shift(); 99 100 ajax( thisRequest.href, function( styles ){ 101 translate( styles, thisRequest.href, thisRequest.media ); 102 parsedSheets[ thisRequest.href ] = true; 103 makeRequests(); 104 } ); 105 } 106 }, 107 108 //find media blocks in css text, convert to style blocks 109 translate = function( styles, href, media ){ 110 var qs = styles.match( /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi ), 111 ql = qs && qs.length || 0, 112 //try to get CSS path 113 href = href.substring( 0, href.lastIndexOf( "/" )), 114 repUrls = function( css ){ 115 return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" ); 116 }, 117 useMedia = !ql && media, 118 //vars used in loop 119 i = 0, 120 j, fullq, thisq, eachq, eql; 121 122 //if path exists, tack on trailing slash 123 if( href.length ){ href += "/"; } 124 125 //if no internal queries exist, but media attr does, use that 126 //note: this currently lacks support for situations where a media attr is specified on a link AND 127 //its associated stylesheet has internal CSS media queries. 128 //In those cases, the media attribute will currently be ignored. 129 if( useMedia ){ 130 ql = 1; 131 } 132 133 134 for( ; i < ql; i++ ){ 135 j = 0; 136 137 //media attr 138 if( useMedia ){ 139 fullq = media; 140 rules.push( repUrls( styles ) ); 141 } 142 //parse for styles 143 else{ 144 fullq = qs[ i ].match( /@media *([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1; 145 rules.push( RegExp.$2 && repUrls( RegExp.$2 ) ); 146 } 147 148 eachq = fullq.split( "," ); 149 eql = eachq.length; 150 151 for( ; j < eql; j++ ){ 152 thisq = eachq[ j ]; 153 mediastyles.push( { 154 media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all", 155 rules : rules.length - 1, 156 hasquery: thisq.indexOf("(") > -1, 157 minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), 158 maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) 159 } ); 160 } 161 } 162 163 applyMedia(); 164 }, 165 166 lastCall, 167 168 resizeDefer, 169 170 // returns the value of 1em in pixels 171 getEmValue = function() { 172 var ret, 173 div = doc.createElement('div'), 174 body = doc.body, 175 fakeUsed = false;
176 177 div.style.cssText = "position:absolute;font-size:1em;width:1em"; 178 179 if( !body ){ 180 body = fakeUsed = doc.createElement( "body" ); 181 body.style.background = "none"; 182 } 183 184 body.appendChild( div ); 185 186 docElem.insertBefore( body, docElem.firstChild ); 187 188 ret = div.offsetWidth; 189 190 if( fakeUsed ){ 191 docElem.removeChild( body ); 192 } 193 else { 194 body.removeChild( div ); 195 } 196 197 //also update eminpx before returning 198 ret = eminpx = parseFloat(ret); 199 200 return ret; 201 }, 202 203 //cached container for 1em value, populated the first time it's needed 204 eminpx, 205 206 //enable/disable styles 207 applyMedia = function( fromResize ){ 208 var name = "clientWidth", 209 docElemProp = docElem[ name ], 210 currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp, 211 styleBlocks = {}, 212 lastLink = links[ links.length-1 ], 213 now = (new Date()).getTime(); 214 215 //throttle resize calls 216 if( fromResize && lastCall && now - lastCall < resizeThrottle ){ 217 clearTimeout( resizeDefer ); 218 resizeDefer = setTimeout( applyMedia, resizeThrottle ); 219 return; 220 } 221 else { 222 lastCall = now; 223 } 224 225 for( var i in mediastyles ){ 226 var thisstyle = mediastyles[ i ], 227 min = thisstyle.minw, 228 max = thisstyle.maxw, 229 minnull = min === null, 230 maxnull = max === null, 231 em = "em"; 232 233 if( !!min ){ 234 min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); 235 } 236 if( !!max ){ 237 max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); 238 } 239 240 // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true 241 if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){ 242 if( !styleBlocks[ thisstyle.media ] ){ 243 styleBlocks[ thisstyle.media ] = []; 244 } 245 styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] ); 246 } 247 } 248 249 //remove any existing respond style element(s) 250 for( var i in appendedEls ){ 251 if( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){ 252 head.removeChild( appendedEls[ i ] ); 253 } 254 } 255 256 //inject active styles, grouped by media type 257 for( var i in styleBlocks ){ 258 var ss = doc.createElement( "style" ), 259 css = styleBlocks[ i ].join( "\n" ); 260 261 ss.type = "text/css"; 262 ss.media = i; 263 264 //originally, ss was appended to a documentFragment and sheets were appended in bulk. 265 //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! 266 head.insertBefore( ss, lastLink.nextSibling ); 267 268 if ( ss.styleSheet ){ 269 ss.styleSheet.cssText = css; 270 } 271 else { 272 ss.appendChild( doc.createTextNode( css ) ); 273 } 274 275 //push to appendedEls to track for later removal 276 appendedEls.push( ss ); 277 } 278 }, 279 //tweaked Ajax functions from Quirksmode 280 ajax = function( url, callback ) { 281 var req = xmlHttp(); 282 if (!req){ 283 return; 284 } 285 req.open( "GET", url, true ); 286 req.onreadystatechange = function () { 287 if ( req.readyState != 4 || req.status != 200 && req.status != 304 ){ 288 return; 289 } 290 callback( req.responseText ); 291 } 292 if ( req.readyState == 4 ){ 293 return; 294 } 295 req.send( null ); 296 }, 297 //define ajax obj 298 xmlHttp = (function() { 299 var xmlhttpmethod = false; 300 try { 301 xmlhttpmethod = new XMLHttpRequest(); 302 } 303 catch( e ){ 304 xmlhttpmethod = new ActiveXObject( "Microsoft.XMLHTTP" ); 305 } 306 return function(){ 307 return xmlhttpmethod; 308 }; 309 })(); 310 311 //translate CSS 312 ripCSS(); 313 314 //expose update for re-running respond later on 315 respond.update = ripCSS; 316 317 //adjust on resize 318 function callMedia(){ 319 applyMedia( true ); 320 } 321 if( win.addEventListener ){ 322 win.addEventListener( "resize", callMedia, false ); 323 } 324 else if( win.attachEvent ){ 325 win.attachEvent( "onresize", callMedia ); 326 } 327})(this); 328 329/** 330 * jQuery Scroll Top Plugin 1.0.0 331 */ 332jQuery(document).ready(function ($) { 333 $('a[href="#scroll-top"]').click(function () { 334 $('html, body').animate({ 335 scrollTop: 0 336 }, 'slow'); 337 return false;
338 }); 339}); 340; 341/** 342 * Handles toggling the main navigation menu for small screens. 343 */ 344jQuery( document ).ready( function( $ ) { 345 var $masthead = $( '#header' ), 346 timeout = false; 347 348 $.fn.smallMenu = function() { 349 $masthead.find( '.site-navigation' ).removeClass( 'main-navigation' ).addClass( 'main-small-navigation' ); 350 $masthead.find( '.site-navigation h1' ).removeClass( 'assistive-text' ).addClass( 'menu-toggle' ); 351 352 $( '.menu-toggle' ).unbind( 'click' ).click( function() { 353 $masthead.find( '.menu' ).toggle(); 354 $( this ).toggleClass( 'toggled-on' ); 355 } ); 356 }; 357 358 // Check viewport width on first load. 359 if ( $( window ).width() < 651 ) 360 $.fn.smallMenu(); 361 362 // Check viewport width when user resizes the browser window. 363 $( window ).resize( function() { 364 var browserWidth = $( window ).width(); 365 366 if ( false !== timeout ) 367 clearTimeout( timeout ); 368 369 timeout = setTimeout( function() { 370 if ( browserWidth < 651 ) { 371 $.fn.smallMenu(); 372 } else { 373 $masthead.find( '.site-navigation' ).removeClass( 'main-small-navigation' ).addClass( 'main-navigation' ); 374 $masthead.find( '.site-navigation h1' ).removeClass( 'menu-toggle' ).addClass( 'assistive-text' ); 375 $masthead.find( '.menu' ).removeAttr( 'style' ); 376 } 377 }, 200 ); 378 } ); 379 380 var container = $( '.site-navigation' ); 381 382 // Fix child menus for touch devices. 383 function fixMenuTouchTaps( container ) { 384 var touchStartFn, 385 parentLink = container.find( '.menu-item-has-children > a, .page_item_has_children > a' ); 386 387 if ( 'ontouchstart' in window ) { 388 touchStartFn = function( e ) { 389 var menuItem = this.parentNode; 390 391 if ( ! menuItem.classList.contains( 'focus' ) ) { 392 e.preventDefault(); 393 for( var i = 0; i < menuItem.parentNode.children.length; ++i ) { 394 if ( menuItem === menuItem.parentNode.children[i] ) { 395 continue; 396 } 397 menuItem.parentNode.children[i].classList.remove( 'focus' ); 398 } 399 menuItem.classList.add( 'focus' ); 400 } else { 401 menuItem.classList.remove( 'focus' ); 402 } 403 }; 404 405 for ( var i = 0; i < parentLink.length; ++i ) { 406 parentLink[i].addEventListener( 'touchstart', touchStartFn, false ) 407 } 408 } 409 } 410 411 fixMenuTouchTaps( container ); 412} );; 413!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.JetpackScriptDataModule=t():e.JetpackScriptDataModule=t()}(globalThis,()=>(()=>{"use strict";var e={729(e,t,r){r.d(t,{$8:()=>n.$8,IT:()=>n.IT,KS:()=>n.KS,L2:()=>n.L2,Sy:()=>n.Sy,au:()=>n.au,d_:()=>n.d_,e5:()=>n.e5,hT:()=>n.hT,lI:()=>n.lI,mH:()=>n.mH,oQ:()=>n.oQ,sV:()=>n.sV});var n=r(336)},336(e,t,r){function n(){return window.JetpackScriptData}function o(){return n()?.site}function i(e=""){return`${n()?.site.admin_url}${e}`}function a(e=""){return i(`admin.php?page=jetpack${e}`)}function u(e=""){return i(`admin.php?page=my-jetpack${e}`)}function p(){return n()?.site.plan?.features?.active??[]}function c(e){return-1!==p().indexOf(e)}function s(){return"wpcom"===n()?.site?.host}function f(){return"woa"===n()?.site?.host}function d(){return n()?.site?.is_wpcom_platform}function l(){return"unknown"===n()?.site?.host}function S(){return s()?"simple":f()?"woa":"jetpack"}function m(e){return n()?.user.current_user.capabilities[e]}r.d(t,{$8:()=>d,IT:()=>c,KS:()=>S,L2:()=>l,Sy:()=>s,au:()=>n,d_:()=>m,e5:()=>u,hT:()=>i,lI:()=>f,mH:()=>p,oQ:()=>a,sV:()=>o})}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};r.r(n),r.d(n,{currentUserCan:()=>o.d_,getActiveFeatures:()=>o.mH,getAdminUrl:()=>o.hT,getJetpackAdminPageUrl:()=>o.oQ,getMyJetpackUrl:()=>o.e5,getScriptData:()=>o.au,getSiteData:()=>o.sV,getSiteType:()=>o.KS,isJetpackSelfHostedSite:()=>o.L2,isSimpleSite:()=>o.Sy,isWoASite:()=>o.lI,isWpcomPlatformSite:()=>o.$8,siteHasFeature:()=>o.IT});var o=r(729);return n})());;
414/** 415 * Observe how the user enters content into the comment form in order to determine whether it's a bot or not. 416 * 417 * Note that no actual input is being saved here, only counts and timings between events. 418 */ 419 420( function() { 421 // Passive event listeners are guaranteed to never call e.preventDefault(), 422 // but they're not supported in all browsers. Use this feature detection 423 // to determine whether they're available for use. 424 var supportsPassive = false; 425 426 try { 427 var opts = Object.defineProperty( {}, 'passive', { 428 get : function() { 429 supportsPassive = true; 430 } 431 } ); 432 433 window.addEventListener( 'testPassive', null, opts ); 434 window.removeEventListener( 'testPassive', null, opts ); 435 } catch ( e ) {} 436 437 function init() { 438 var input_begin = ''; 439 440 var keydowns = {}; 441 var lastKeyup = null; 442 var lastKeydown = null; 443 var keypresses = []; 444 445 var modifierKeys = []; 446 var correctionKeys = []; 447 448 var lastMouseup = null; 449 var lastMousedown = null; 450 var mouseclicks = []; 451 var mouseclickCoordinates = []; 452 453 var mousemoveTimer = null; 454 var lastMousemoveX = null; 455 var lastMousemoveY = null; 456 var lastMousemoveTime = null; 457 var mousemoveStart = null; 458 var mousemoves = []; 459 var intervalsBetweenMousemovesAndClicks = []; 460 461 var touchmoveCountTimer = null; 462 var touchmoveCount = 0; 463 464 var lastTouchEnd = null; 465 var lastTouchStart = null; 466 var touchEvents = []; 467 468 var scrollCountTimer = null; 469 var scrollCount = 0; 470 471 var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ]; 472 var modifierKeyCodes = [ 'Shift', 'CapsLock' ]; 473 474 var forms = document.querySelectorAll( 'form[method=post]' ); 475 476 for ( var i = 0; i < forms.length; i++ ) { 477 var form = forms[i]; 478 479 var formAction = form.getAttribute( 'action' ); 480 481 // Ignore forms that POST directly to other domains; these could be things like payment forms. 482 if ( formAction ) { 483 // Check that the form is posting to an external URL, not a path. 484 if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) { 485 if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) { 486 continue; 487 } 488 } 489 } 490 491 form.addEventListener( 'submit', function () { 492 var ak_bkp = prepare_array_for_request( keypresses ); 493 var ak_bmc = prepare_array_for_request( mouseclicks ); 494 var ak_bte = prepare_array_for_request( touchEvents ); 495 var ak_bmm = prepare_array_for_request( mousemoves ); 496 var ak_bcc = prepare_array_for_request( mouseclickCoordinates ); 497 var ak_bibmac = intervalsBetweenMousemovesAndClicks.slice( 0, 100 ).join( ';' ); 498 499 var input_fields = { 500 // When did the user begin entering any input? 501 'bib': input_begin, 502 503 // When was the form submitted? 504 'bfs': Date.now(), 505 506 // How many keypresses did they make? 507 'bkpc': keypresses.length, 508 509 // How quickly did they press a sample of keys, and how long between them? 510 'bkp': ak_bkp, 511 512 // How quickly did they click the mouse, and how long between clicks? 513 'bmc': ak_bmc, 514 515 // How many mouseclicks did they make? 516 'bmcc': mouseclicks.length, 517 518 // When did they press modifier keys (like Shift or Capslock)? 519 'bmk': modifierKeys.join( ';' ), 520 521 // When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back 522 'bck': correctionKeys.join( ';' ), 523 524 // How many times did they move the mouse? 525 'bmmc': mousemoves.length, 526 527 // How many times did they move around using a touchscreen? 528 'btmc': touchmoveCount, 529 530 // How many times did they scroll? 531 'bsc': scrollCount, 532 533 // How quickly did they perform touch events, and how long between them? 534 'bte': ak_bte, 535 536 // How many touch events were there? 537 'btec' : touchEvents.length, 538 539 // How quickly did they move the mouse, and how long between moves? 540 'bmm' : ak_bmm, 541 542 // Click coordinates 543 'bcc' : ak_bcc, 544 545 // Milliseconds between last mouse movement and each click 546 'bibmac' : ak_bibmac 547 }; 548 549 var akismet_field_prefix = 'ak_'; 550 551 if ( this.getElementsByClassName ) { 552 // Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields. 553 var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' ); 554 555 for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) { 556 var container = possible_akismet_containers.item( containerIndex ); 557
558 if ( container.getAttribute( 'data-prefix' ) ) { 559 akismet_field_prefix = container.getAttribute( 'data-prefix' ); 560 break; 561 } 562 } 563 } 564 565 for ( var field_name in input_fields ) { 566 var field = document.createElement( 'input' ); 567 field.setAttribute( 'type', 'hidden' ); 568 field.setAttribute( 'name', akismet_field_prefix + field_name ); 569 field.setAttribute( 'value', input_fields[ field_name ] ); 570 this.appendChild( field ); 571 } 572 }, supportsPassive ? { passive: true } : false ); 573 574 form.addEventListener( 'keydown', function ( e ) { 575 // If you hold a key down, some browsers send multiple keydown events in a row. 576 // Ignore any keydown events for a key that hasn't come back up yet. 577 if ( e.key in keydowns ) { 578 return; 579 } 580 581 var keydownTime = ( new Date() ).getTime(); 582 keydowns[ e.key ] = [ keydownTime ]; 583 584 if ( ! input_begin ) { 585 input_begin = keydownTime; 586 } 587 588 // In some situations, we don't want to record an interval since the last keypress -- for example, 589 // on the first keypress, or on a keypress after focus has changed to another element. Normally, 590 // we want to record the time between the last keyup and this keydown. But if they press a 591 // key while already pressing a key, we want to record the time between the two keydowns. 592 593 var lastKeyEvent = Math.max( lastKeydown, lastKeyup ); 594 595 if ( lastKeyEvent ) { 596 keydowns[ e.key ].push( keydownTime - lastKeyEvent ); 597 } 598 599 lastKeydown = keydownTime; 600 }, supportsPassive ? { passive: true } : false ); 601 602 form.addEventListener( 'keyup', function ( e ) { 603 if ( ! ( e.key in keydowns ) ) { 604 // This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or... 605 return; 606 } 607 608 var keyupTime = ( new Date() ).getTime(); 609 610 if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) { 611 if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) { 612 modifierKeys.push( keypresses.length - 1 ); 613 } else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) { 614 correctionKeys.push( keypresses.length - 1 ); 615 } else { 616 // ^ Don't record timings for keys like Shift or backspace, since they 617 // typically get held down for longer than regular typing. 618 619 var keydownTime = keydowns[ e.key ][0]; 620 621 var keypress = []; 622 623 // Keypress duration. 624 keypress.push( keyupTime - keydownTime ); 625 626 // Amount of time between this keypress and the previous keypress. 627 if ( keydowns[ e.key ].length > 1 ) { 628 keypress.push( keydowns[ e.key ][1] ); 629 } 630 631 keypresses.push( keypress ); 632 } 633 } 634 635 delete keydowns[ e.key ]; 636 637 lastKeyup = keyupTime; 638 }, supportsPassive ? { passive: true } : false ); 639 640 form.addEventListener( "focusin", function ( e ) { 641 lastKeydown = null; 642 lastKeyup = null; 643 keydowns = {}; 644 }, supportsPassive ? { passive: true } : false ); 645 646 form.addEventListener( "focusout", function ( e ) { 647 lastKeydown = null; 648 lastKeyup = null; 649 keydowns = {}; 650 }, supportsPassive ? { passive: true } : false ); 651 } 652 653 document.addEventListener( 'mousedown', function ( e ) { 654 lastMousedown = ( new Date() ).getTime(); 655 656 if ( lastMousemoveTime ) { 657 intervalsBetweenMousemovesAndClicks.push( lastMousedown - lastMousemoveTime ); 658 } 659 660 var mouseclickCoordinate = []; 661 662 var rect = e.target.getBoundingClientRect(); 663 var relativeX = e.clientX - rect.left; 664 var relativeY = e.clientY - rect.top; 665 666 // Pixel offset of the click within the target element. 667 mouseclickCoordinate.push( Math.round( relativeX ) ); 668 mouseclickCoordinate.push( Math.round( relativeY ) ); 669 670 // Percentage offset of the click within the target element. 671 mouseclickCoordinate.push( rect.width > 0 ? Math.round( relativeX / rect.width * 100 ) : 0 ); 672 mouseclickCoordinate.push( rect.height > 0 ? Math.round( relativeY / rect.height * 100 ) : 0 ); 673 674 mouseclickCoordinates.push( mouseclickCoordinate ); 675 }, supportsPassive ? { passive: true } : false ); 676 677 document.addEventListener( 'mouseup', function ( e ) { 678 if ( ! lastMousedown ) { 679 // If the mousedown happened before this script was loaded, but the mouseup happened after... 680 return; 681 } 682 683 var now = ( new Date() ).getTime(); 684 685 var mouseclick = []; 686 mouseclick.push( now - lastMousedown ); 687 688 if ( lastMouseup ) { 689 mouseclick.push( lastMousedown - lastMouseup ); 690 } 691 692 mouseclicks.push( mouseclick ); 693 694 lastMouseup = now; 695 696 // If the mouse has been clicked, don't record this time as an interval between keypresses. 697 lastKeydown = null; 698 lastKeyup = null; 699 keydowns = {}; 700 }, supportsPassive ? { passive: true } : false ); 701 702 document.addEventListener( 'mousemove', function ( e ) { 703 lastMousemoveTime = ( new Date() ).getTime(); 704 705 if ( mousemoveTimer ) { 706 clearTimeout( mousemoveTimer ); 707 mousemoveTimer = null; 708 } 709 else { 710 mousemoveStart = lastMousemoveTime; 711 lastMousemoveX = e.offsetX; 712 lastMousemoveY = e.offsetY; 713 } 714 715 mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) { 716 var now = ( new Date() ).getTime() - 500; // To account for the timer delay. 717 718 var mousemove = []; 719 mousemove.push( now - originalMousemoveStart ); 720 mousemove.push( 721 Math.round( 722 Math.sqrt( 723 Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) + 724 Math.pow( theEvent.offsetY - lastMousemoveY, 2 ) 725 ) 726 ) 727 ); 728 729 if ( mousemove[1] > 0 ) { 730 // If there was no measurable distance, then it wasn't really a move. 731 mousemoves.push( mousemove ); 732 } 733 734 mousemoveStart = null; 735 mousemoveTimer = null; 736 }, 500, e, mousemoveStart ); 737 }, supportsPassive ? { passive: true } : false ); 738 739 document.addEventListener( 'touchmove', function ( e ) { 740 if ( touchmoveCountTimer ) { 741 clearTimeout( touchmoveCountTimer ); 742 } 743 744 touchmoveCountTimer = setTimeout( function () { 745 touchmoveCount++; 746 }, 500 ); 747 }, supportsPassive ? { passive: true } : false ); 748 749 document.addEventListener( 'touchstart', function ( e ) { 750 lastTouchStart = ( new Date() ).getTime(); 751 }, supportsPassive ? { passive: true } : false ); 752 753 document.addEventListener( 'touchend', function ( e ) { 754 if ( ! lastTouchStart ) { 755 // If the touchstart happened before this script was loaded, but the touchend happened after... 756 return; 757 } 758 759 var now = ( new Date() ).getTime(); 760 761 var touchEvent = []; 762 touchEvent.push( now - lastTouchStart ); 763 764 if ( lastTouchEnd ) { 765 touchEvent.push( lastTouchStart - lastTouchEnd ); 766 } 767 768 touchEvents.push( touchEvent ); 769 770 lastTouchEnd = now; 771 772 // Don't record this time as an interval between keypresses. 773 lastKeydown = null; 774 lastKeyup = null; 775 keydowns = {}; 776 }, supportsPassive ? { passive: true } : false ); 777 778 document.addEventListener( 'scroll', function ( e ) {
779 if ( scrollCountTimer ) { 780 clearTimeout( scrollCountTimer ); 781 } 782 783 scrollCountTimer = setTimeout( function () { 784 scrollCount++; 785 }, 500 ); 786 }, supportsPassive ? { passive: true } : false ); 787 } 788 789 /** 790 * For the timing/coordinate data that is collected, don't send more than `limit` data points in the request. 791 * Choose a random slice and send those, with each batch separated by semicolons and the items in each batch 792 * separated by commas. 793 */ 794 function prepare_array_for_request( a, limit ) { 795 if ( ! limit ) { 796 limit = 100; 797 } 798 799 var rv = ''; 800 801 if ( a.length > 0 ) { 802 var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) ); 803 804 for ( var i = 0; i < limit && i < a.length; i++ ) { 805 var entry = a[ random_starting_point + i ]; 806 rv += entry.join( ',' ) + ';'; 807 } 808 } 809 810 return rv; 811 } 812 813 if ( document.readyState !== 'loading' ) { 814 init(); 815 } else { 816 document.addEventListener( 'DOMContentLoaded', init ); 817 } 818})();; 819( function() { 820 var cookieValue = document.cookie.replace( /(?:(?:^|.*;\s*)eucookielaw\s*\=\s*([^;]*).*$)|^.*$/, '$1' ); 821 var overlay = document.querySelector( '#eu-cookie-law' ); 822 var container = document.querySelector( '.widget_eu_cookie_law_widget' ); 823 var initialScrollPosition, scrollFunction; 824 825 function remove( el ) { 826 return el && el.parentElement && el.parentElement.removeChild( el ); 827 } 828 829 function triggerDismissEvent() { 830 try { 831 const dismissEvent = new Event( 'eucookielaw-dismissed' ); 832 document.dispatchEvent( dismissEvent ); 833 } catch ( err ) { } 834 } 835 836 function removeOverlay() { 837 remove( overlay ); 838 triggerDismissEvent(); 839 } 840 841 function fade( el, type, fn ) { 842 var duration = 400; 843 844 el.style.display = 'block'; 845 el.style.transitionProperty = 'opacity'; 846 el.style.transitionDuration = duration + 'ms'; 847 el.style.opacity = type === 'in' ? 0 : 1; 848 849 // Double rAF to ensure styles are applied cross-browser. 850 requestAnimationFrame( function () { 851 requestAnimationFrame( function() { 852 el.style.opacity = type === 'in' ? 1 : 0; 853 // Wait for animation. 854 setTimeout( function () { 855 // Clean up. 856 el.style.removeProperty( 'opacity' ); 857 el.style.removeProperty( 'transition-property' ); 858 el.style.removeProperty( 'transition-duration' ); 859 860 if ( type === 'out' ) { 861 el.style.display = 'none'; 862 } 863 864 if ( typeof fn === 'function' ) { 865 fn(); 866 } 867 }, duration + 50 ); 868 } ); 869 } ); 870 } 871 872 function appendWidget() { 873 document.body.appendChild( container ); 874 overlay.style.display = 'block'; 875 fade( container, 'in' ); 876 } 877 878 if ( typeof wp !== 'undefined' && !! wp.customize ) { 879 appendWidget(); 880 return; 881 } 882 883 if ( ! overlay || ! container ) { 884 return; 885 } 886 887 if ( overlay.classList.contains( 'ads-active' ) ) { 888 var adsCookieValue = document.cookie.replace( /(?:(?:^|.*;\s*)personalized-ads-consent\s*\=\s*([^;]*).*$)|^.*$/, '$1' ); 889 if ( cookieValue !== '' && adsCookieValue !== '' ) { 890 removeOverlay(); 891 } 892 } else if ( cookieValue !== '' ) { 893 removeOverlay(); 894 } 895 896 appendWidget(); 897 898 overlay.querySelector( 'form' ).addEventListener( 'submit', accept ); 899 900 if ( overlay.classList.contains( 'hide-on-scroll' ) ) { 901 initialScrollPosition = window.pageYOffset; 902 903 scrollFunction = function() { 904 if ( Math.abs( window.pageYOffset - initialScrollPosition ) > 50 ) { 905 accept(); 906 } 907 }; 908 909 window.addEventListener( 'scroll', scrollFunction ); 910 } else if ( overlay.classList.contains( 'hide-on-time' ) ) { 911 var timeout = parseInt( overlay.getAttribute( 'data-hide-timeout' ), 10 ) || 0; 912 setTimeout( accept, timeout * 1000 ); 913 } 914 915 var accepted = false; 916 function accept( event ) { 917 if ( accepted ) { 918 return; 919 } 920 accepted = true; 921 922 if ( event && event.preventDefault ) { 923 event.preventDefault(); 924 } 925 926 if ( overlay.classList.contains( 'hide-on-scroll' ) ) { 927 window.removeEventListener( 'scroll', scrollFunction ); 928 } 929 930 var expireTime = new Date(); 931 var consentExpiration = parseInt( overlay.getAttribute( 'data-consent-expiration' ), 10 ) || 0; 932 expireTime.setTime( expireTime.getTime() + ( consentExpiration * 24 * 60 * 60 * 1000 ) ); 933 934 document.cookie = 'eucookielaw=' + expireTime.getTime() + ';path=/;expires=' + expireTime.toGMTString(); 935 if ( overlay.classList.contains( 'ads-active' ) && overlay.classList.contains( 'hide-on-button' ) ) { 936 document.cookie = 'personalized-ads-consent=' + expireTime.getTime() + ';path=/;expires=' + expireTime.toGMTString(); 937 } 938 939 fade( overlay, 'out', function() { 940 removeOverlay(); 941 remove( container ); 942 } ); 943 } 944} )(); 945;
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.