PageSourceSearch

https://bibliot3ca.com/_static/??-eJydkNFOwzAMRX+I1OuE2PaA+BSUJm7m…pUjElZjtdikbCveHa663uJrfzjtjrv96eUwfQMGw8St

js bibliot3ca.com collected 2026-10-02 11:26:36 UTC 89,919 bytes, 1,892 lines download raw bytes

1/* global wpcom_reblog */
2
3var jetpackLikesWidgetBatch = [];
4var jetpackLikesMasterReady = false;
5
6// Due to performance problems on pages with a large number of widget iframes that need to be loaded,
7// we are limiting the processing at any instant to unloaded widgets that are currently in viewport,
8// plus this constant that will allow processing of widgets above and bellow the current fold.
9// This aim of it is to improve the UX and hide the transition from unloaded to loaded state from users.
10var jetpackLikesLookAhead = 2000; // pixels
11
12// Keeps track of loaded comment likes widget so we can unload them when they are scrolled out of view.
13var jetpackCommentLikesLoadedWidgets = [];
14
15var jetpackLikesDocReadyPromise = new Promise( resolve => {
16	if ( document.readyState !== 'loading' ) {
17		resolve();
18	} else {
19		window.addEventListener( 'DOMContentLoaded', () => resolve() );
20	}
21} );
22
23function JetpackLikesPostMessage( message, target ) {
24	if ( typeof message === 'string' ) {
25		try {
26			message = JSON.parse( message );
27		} catch ( e ) {
28			return;
29		}
30	}
31
32	if ( target && typeof target.postMessage === 'function' ) {
33		try {
34			target.postMessage(
35				JSON.stringify( {
36					type: 'likesMessage',
37					data: message,
38				} ),
39				'*'
40			);
41		} catch ( e ) {
42			return;
43		}
44	}
45}
46
47function JetpackLikesBatchHandler() {
48	const requests = [];
49	document.querySelectorAll( 'div.jetpack-likes-widget-unloaded' ).forEach( widget => {
50		if ( jetpackLikesWidgetBatch.indexOf( widget.id ) > -1 ) {
51			return;
52		}
53
54		if ( ! jetpackIsScrolledIntoView( widget ) ) {
55			return;
56		}
57
58		jetpackLikesWidgetBatch.push( widget.id );
59
60		var regex = /like-(post|comment)-wrapper-(\d+)-(\d+)-(\w+)/,
61			match = regex.exec( widget.id ),
62			info;
63
64		if ( ! match || match.length !== 5 ) {
65			return;
66		}
67
68		info = {
69			blog_id: match[ 2 ],
70			width: widget.width,
71		};
72
73		if ( 'post' === match[ 1 ] ) {
74			info.post_id = match[ 3 ];
75		} else if ( 'comment' === match[ 1 ] ) {
76			info.comment_id = match[ 3 ];
77		}
78
79		info.obj_id = match[ 4 ];
80
81		requests.push( info );
82	} );
83
84	if ( requests.length > 0 ) {
85		JetpackLikesPostMessage(
86			{ event: 'initialBatch', requests: requests },
87			window.frames[ 'likes-master' ]
88		);
89	}
90}
91
92function JetpackLikesMessageListener( event ) {
93	let message = event && event.data;
94	if ( typeof message === 'string' ) {
95		try {
96			message = JSON.parse( message );
97		} catch ( err ) {
98			return;
99		}
100	}
101
102	const type = message && message.type;
103	const data = message && message.data;
104
105	if ( type !== 'likesMessage' || typeof data.event === 'undefined' ) {
106		return;
107	}
108
109	// We only allow messages from one origin
110	const allowedOrigin = 'https://widgets.wp.com';
111	if ( allowedOrigin !== event.origin ) {
112		return;
113	}
114
115	switch ( data.event ) {
116		case 'masterReady':
117			jetpackLikesDocReadyPromise.then( () => {
118				jetpackLikesMasterReady = true;
119
120				const stylesData = {
121					event: 'injectStyles',
122				};
123				const sdTextColor = document.querySelector( '.sd-text-color' );
124				const sdLinkColor = document.querySelector( '.sd-link-color' );
125				const sdTextColorStyles = ( sdTextColor && getComputedStyle( sdTextColor ) ) || {};
126				const sdLinkColorStyles = ( sdLinkColor && getComputedStyle( sdLinkColor ) ) || {};
127
128				// enable reblogs if they are enabled for the page
129				if ( document.body.classList.contains( 'jetpack-reblog-enabled' ) ) {
130					JetpackLikesPostMessage( { event: 'reblogsEnabled' }, window.frames[ 'likes-master' ] );
131				}
132
133				stylesData.textStyles = {
134					color: sdTextColorStyles[ 'color' ],
135					fontFamily: sdTextColorStyles[ 'font-family' ],
136					fontSize: sdTextColorStyles[ 'font-size' ],
137					direction: sdTextColorStyles[ 'direction' ],
138					fontWeight: sdTextColorStyles[ 'font-weight' ],
139					fontStyle: sdTextColorStyles[ 'font-style' ],
140					textDecoration: sdTextColorStyles[ 'text-decoration' ],
141				};
142
143				stylesData.linkStyles = {
144					color: sdLinkColorStyles[ 'color' ],
145					fontFamily: sdLinkColorStyles[ 'font-family' ],
146					fontSize: sdLinkColorStyles[ 'font-size' ],
147					textDecoration: sdLinkColorStyles[ 'text-decoration' ],
148					fontWeight: sdLinkColorStyles[ 'font-weight' ],
149					fontStyle: sdLinkColorStyles[ 'font-style' ],
150				};
151
152				JetpackLikesPostMessage( stylesData, window.frames[ 'likes-master' ] );
153
154				JetpackLikesBatchHandler();
155			} );
156
157			break;
158
159		// We're keeping this for planned future follow ups.
160		// @see: https://github.com/Automattic/jetpack/pull/42361#discussion_r1995338815
161		case 'showLikeWidget':
162			break;
163
164		// We're keeping this for planned future follow ups.
165		// @see: https://github.com/Automattic/jetpack/pull/42361#discussion_r1995338815
166		case 'showCommentLikeWidget':
167			break;
168
169		case 'killCommentLikes':
170			// If kill switch for comment likes is enabled remove all widgets wrappers and `Loading...` placeholders.
171			document
172				.querySelectorAll( '.jetpack-comment-likes-widget-wrapper' )
173				.forEach( wrapper => wrapper.remove() );
174			break;
175
176		case 'clickReblogFlair':
177			if ( wpcom_reblog && typeof wpcom_reblog.toggle_reblog_box_flair === 'function' ) {
178				wpcom_reblog.toggle_reblog_box_flair( data.obj_id, data.post_id );
179			}
180			break;
181
182		case 'hideOtherGravatars': {
183			hideLikersPopover();
184			break;
185		}
186
187		case 'showOtherGravatars': {
188			const container = document.querySelector( '#likes-other-gravatars' );
189
190			if ( ! container ) {
191				break;
192			}
193
194			const list = container.querySelector( 'ul' );
195
196			container.style.display = 'none';
197			list.innerHTML = '';
198
199			container
200				.querySelectorAll( '.likes-text span' )
201				.forEach( item => ( item.textContent = data.totalLikesLabel ) );
202
203			( data.likers || [] ).forEach( async ( liker, index ) => {
204				if ( liker.profile_URL.substr( 0, 4 ) !== 'http' ) {
205					// We only display gravatars with http or https schema
206					return;
207				}
208
209				const element = document.createElement( 'li' );
210				list.append( element );
211
212				element.innerHTML = `
213				<a href="${ encodeURI( liker.profile_URL ) }" rel="nofollow" target="_parent" class="wpl-liker">
214					<img src="${ encodeURI( liker.avatar_URL ) }"
215						alt=""
216						style="width: 28px; height: 28px;" />
217					<span></span>
218				</a>
219				`;
220
221
222				// Add some extra attributes through native methods, to ensure strings are sanitized.
223				element.classList.add( liker.css_class );
224				element.querySelector( 'img' ).alt = data.avatarAltTitle.replace( '%s', liker.name );
225				element.querySelector( 'span' ).innerText = liker.name;
226
227				if ( index === data.likers.length - 1 ) {
228					element.addEventListener( 'keydown', ( e ) => {
229						if ( e.key === 'Tab' && ! e.shiftKey ) {
230							e.preventDefault();
231							hideLikersPopover();
232
233							JetpackLikesPostMessage(
234								{ event: 'focusLikesCount', parent: data.parent },
235								window.frames[ 'likes-master' ]
236							);
237						}
238					} );
239				}
240			} );
241
242			const positionPopup = function() {
243				const containerStyle = getComputedStyle(container);
244				const isRtl = containerStyle.direction === 'rtl';
245
246				const el = document.querySelector( `*[name='${ data.parent }']` );
247				const rect = el.getBoundingClientRect();
248				const win = el.ownerDocument.defaultView;
249
250				const offset = {
251					top: rect.top + win.pageYOffset,
252					left: rect.left + win.pageXOffset,
253				};
254
255				// don't display yet or we get skewed window.innerWidth later
256				container.style.display = 'none';
257
258				let containerLeft = 0;
259				container.style.top = offset.top + data.position.top - 1 + 'px';
260
261				if ( isRtl ) {
262					const visibleAvatarsCount = data && data.likers ? Math.min( data.likers.length, 5 ) : 0;
263					// 24px is the width of the avatar + 4px is the padding between avatars
264					containerLeft = offset.left + data.position.left + 24 * visibleAvatarsCount + 4;
265					container.style.transform = 'translateX(-100%)';
266				} else {
267					containerLeft = offset.left + data.position.left;
268				}
269				container.style.left = containerLeft + 'px';
270
271				// Container width - padding
272				const initContainerWidth = data.width - 20;
273				const rowLength = Math.floor( initContainerWidth / 37 );
274				// # of rows + (avatar + avatar padding) + text above + container padding
275				let height = Math.ceil( data.likers.length / rowLength ) * 37 + 17 + 22;
276				if ( height > 204 ) {
277					height = 204;
278				}
279
280				// If the popup is overflows viewport width, we should show it on the next line
281				// Push it offscreen to calculated rendered width
282				const windowWidth = win.innerWidth;
283				container.style.left = '-9999px';
284				container.style.display = 'block';
285
286				// If the popup exceeds the viewport width,
287				// flip the position of the popup.
288				const containerWidth = container.offsetWidth;
289				const containerRight = containerLeft + containerWidth;
290
291				if ( containerRight > windowWidth && ! isRtl) {
292					containerLeft = rect.left + rect.width - containerWidth;
293				} else if ( containerLeft - containerWidth < 0 && isRtl ) {
294					container.style.transform = 'none';
295					containerLeft = rect.left;
296				}
297				// Set the container left
298				container.style.left = containerLeft + 'px';
299
300				container.setAttribute( 'aria-hidden', 'false' );
301			}
302
303			positionPopup();
304			container.focus();
305
306			const debounce = function( func, wait ) {
307				var timeout;
308				return function() {
309					var context = this;
310					var args = arguments;
311					clearTimeout( timeout );
312					timeout = setTimeout( function() {
313						func.apply( context, args );
314					}, wait );
315				};
316			};
317
318			const debouncedPositionPopup = debounce( positionPopup, 100 );
319
320			// Keep a reference of this function in the element itself
321			// so that we can destroy it later
322			container.__resizeHandler = debouncedPositionPopup;
323
324			// When window is resized, resize the popup.
325			window.addEventListener( "resize", debouncedPositionPopup );
326		}
327	}
328}
329
330window.addEventListener( 'message', JetpackLikesMessageListener );
331
332function hideLikersPopover() {
333	const container = document.querySelector( '#likes-other-gravatars' );
334
335	if ( container ) {
336		container.style.display = 'none';
337		container.setAttribute( 'aria-hidden', 'true' );
338
339		// Remove the resize event listener and cleanup.
340		const resizeHandler = container.__resizeHandler;
341		if ( resizeHandler ) {
342			window.removeEventListener( "resize", resizeHandler );
343			delete container.__resizeHandler;
344		}
345	}
346}
347
348document.addEventListener( 'click', hideLikersPopover );
349
350function JetpackLikesWidgetQueueHandler() {
351	var wrapperID;
352
353	if ( ! jetpackLikesMasterReady ) {
354		setTimeout( JetpackLikesWidgetQueueHandler, 500 );
355		return;
356	}
357
358	// Restore widgets to initial unloaded state when they are scrolled out of view.
359	jetpackUnloadScrolledOutWidgets();
360
361	var unloadedWidgetsInView = jetpackGetUnloadedWidgetsInView();
362
363	if ( unloadedWidgetsInView.length > 0 ) {
364		// Grab any unloaded widgets for a batch request
365		JetpackLikesBatchHandler();
366	}
367
368	for ( var i = 0, length = unloadedWidgetsInView.length; i <= length - 1; i++ ) {
369		wrapperID = unloadedWidgetsInView[ i ].id;
370
371		if ( ! wrapperID ) {
372			continue;
373		}
374
375		jetpackLoadLikeWidgetIframe( wrapperID );
376	}
377}
378
379function jetpackLoadLikeWidgetIframe( wrapperID ) {
380	if ( typeof wrapperID === 'undefined' ) {
381		return;
382	}
383
384	const wrapper = document.querySelector( '#' + wrapperID );
385	wrapper.querySelectorAll( 'iframe' ).forEach( iFrame => iFrame.remove() );
386
387	const placeholder = wrapper.querySelector( '.likes-widget-placeholder' );
388
389	// Post like iframe
390	if ( placeholder && placeholder.classList.contains( 'post-likes-widget-placeholder' ) ) {
391		const postLikesFrame = document.createElement( 'iframe' );
392
393		postLikesFrame.classList.add( 'post-likes-widget', 'jetpack-likes-widget' );
394		postLikesFrame.name = wrapper.dataset.name;
395		postLikesFrame.src = wrapper.dataset.src;
396		postLikesFrame.height = '55px';
397		postLikesFrame.width = '100%';
398		postLikesFrame.frameBorder = '0';
399		postLikesFrame.scrolling = 'no';
400		postLikesFrame.title = wrapper.dataset.title;
401
402		placeholder.after( postLikesFrame );
403	}
404
405	// Comment like iframe
406	if ( placeholder.classList.contains( 'comment-likes-widget-placeholder' ) ) {
407		const commentLikesFrame = document.createElement( 'iframe' );
408
409		commentLikesFrame.class = 'comment-likes-widget-frame jetpack-likes-widget-frame';
410		commentLikesFrame.name = wrapper.dataset.name;
411		commentLikesFrame.src = wrapper.dataset.src;
412		commentLikesFrame.height = '18px';
413		commentLikesFrame.width = '100%';
414		commentLikesFrame.frameBorder = '0';
415		commentLikesFrame.scrolling = 'no';
416
417		wrapper.querySelector( '.comment-like-feedback' ).after( commentLikesFrame );
418
419		jetpackCommentLikesLoadedWidgets.push( commentLikesFrame );
420	}
421
422	wrapper.classList.remove( 'jetpack-likes-widget-unloaded' );
423	wrapper.classList.add( 'jetpack-likes-widget-loading' );
424
425	wrapper.querySelector( 'iframe' ).addEventListener( 'load', e => {
426		JetpackLikesPostMessage(
427			{ event: 'loadLikeWidget', name: e.target.name, width: e.target.width },
428			window.frames[ 'likes-master' ]
429		);
430
431		wrapper.classList.remove( 'jetpack-likes-widget-loading' );
432		wrapper.classList.add( 'jetpack-likes-widget-loaded' );
433	} );
434}
435
436function jetpackGetUnloadedWidgetsInView() {
437	const unloadedWidgets = document.querySelectorAll( 'div.jetpack-likes-widget-unloaded' );
438
439	return [ ...unloadedWidgets ].filter( item => jetpackIsScrolledIntoView( item ) );
440}
441
442function jetpackIsScrolledIntoView( element ) {
443	const top = element.getBoundingClientRect().top;
444	const bottom = element.getBoundingClientRect().bottom;
445
446	// Allow some slack above and bellow the fold with jetpackLikesLookAhead,
447	// with the aim of hiding the transition from unloaded to loaded widget from users.
448	return top + jetpackLikesLookAhead >= 0 && bottom <= window.innerHeight + jetpackLikesLookAhead;
449}
450
451function jetpackUnloadScrolledOutWidgets() {
452	for ( let i = jetpackCommentLikesLoadedWidgets.length - 1; i >= 0; i-- ) {
453		const currentWidgetIframe = jetpackCommentLikesLoadedWidgets[ i ];
454
455		if ( ! jetpackIsScrolledIntoView( currentWidgetIframe ) ) {
456			const widgetWrapper =
457				currentWidgetIframe &&
458				currentWidgetIframe.parentElement &&
459				currentWidgetIframe.parentElement.parentElement;
460
461			// Restore parent class to 'unloaded' so this widget can be picked up by queue manager again if needed.
462			widgetWrapper.classList.remove( 'jetpack-likes-widget-loaded' );
463			widgetWrapper.classList.remove( 'jetpack-likes-widget-loading' );
464			widgetWrapper.classList.add( 'jetpack-likes-widget-unloaded' );
465
466			// Bring back the loading placeholder into view.
467			widgetWrapper
468				.querySelectorAll( '.comment-likes-widget-placeholder' )
469				.forEach( item => ( item.style.display = 'block' ) );
470
471			// Remove it from the list of loaded widgets.
472			jetpackCommentLikesLoadedWidgets.splice( i, 1 );
473
474			// Remove comment like widget iFrame.
475			currentWidgetIframe.remove();
476		}
477	}
478}
479
480var jetpackWidgetsDelayedExec = function ( after, fn ) {
481	var timer;
482	return function () {
483		clearTimeout( timer );
484		timer = setTimeout( fn, after );
485	};
486};
487
488var jetpackOnScrollStopped = jetpackWidgetsDelayedExec( 250, JetpackLikesWidgetQueueHandler );
489
490// Load initial batch of widgets, prior to any scrolling events.
491JetpackLikesWidgetQueueHandler();
492
493// Add event listener to execute queue handler after scroll.
494window.addEventListener( 'scroll', jetpackOnScrollStopped, true );
495;
496(()=>{(function(){var Scroller,stats,type,text,totop,loading_text,isIE=-1!==navigator.userAgent.
496search("MSIE");if(isIE){var IEVersion=navigator.userAgent.match(/MSIE\s?(\d+)\.?\d*;/);IEVersion=parseInt(IEVersion[1])}function fullscreenState(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?1:0}"https:"===document.location.protocol&&(infiniteScroll.settings.ajaxurl=infiniteScroll.settings.ajaxurl.replace("http://","https://")),Scroller=function(e){var t=this;this.id=e.id,this.body=document.body,this.window=window,this.element=document.getElementById(e.id),this.wrapperClass=e.wrapper_class,this.ready=!0,this.disabled=!1,this.page=1,this.offset=e.offset,this.currentday=e.currentday,this.order=e.order,this.throttle=!1,this.click_handle=e.click_handle,this.google_analytics=e.google_analytics,this.history=e.history,this.origURL=window.location.href,this.handle=document.createElement("div"),this.handle.setAttribute("id","infinite-handle");var n=document.createElement("span"),i=document.createElement("button");i.textContent=text,n.appendChild(i),this.handle.appendChild(n),this.footer={el:document.getElementById("infinite-footer"),wrap:e.footer},this.checkViewportOnLoadBound=t.checkViewportOnLoad.bind(this),this.wpMediaelement=null,"scroll"===type?(this.window.addEventListener("scroll",function(){t.throttle=!0}),t.gotop(),setInterval(function(){t.throttle&&(t.throttle=!1,t.thefooter(),t.refresh(),t.determineURL())},250),t.ensureFilledViewport(),this.body.addEventListener("is.post-load",t.checkViewportOnLoadBound)):"click"===type&&(this.click_handle&&this.element.appendChild(this.handle),this.handle.addEventListener("click",function(){t.click_handle&&t.handle.parentNode.removeChild(t.handle),t.refresh()})),this.body.addEventListener("is.post-load",t.initializeMejs)},Scroller.prototype.getScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},Scroller.prototype.extend=function(e){e=e||{};for(var t=1;t<arguments.length;t++)if(arguments[t])for(var n in arguments[t])Object.hasOwn(arguments[t],n)&&(e[n]=arguments[t][n]);return e},Scroller.prototype.check=function(){return this.measure(this.element,[this.wrapperClass]).bottom<2*this.window.innerHeight},Scroller.prototype.render=function(e){var t=Array.prototype.slice.call(e.fragment.childNodes);for(this.body.classList.add("infinity-success");t.length>0;){var n=t.shift();this.element.appendChild(n)}this.trigger(this.body,"is.post-load",{jqueryEventName:"post-load",data:e}),this.ready=!0},Scroller.prototype.query=function(){return{page:this.page+this.offset,currentday:this.currentday,order:this.order,scripts:window.infiniteScroll.settings.scripts,styles:window.infiniteScroll.settings.styles,query_args:window.infiniteScroll.settings.query_args,query_before:window.infiniteScroll.settings.query_before,last_post_date:window.infiniteScroll.settings.last_post_date}},Scroller.prototype.animate=function(e,t){var n=performance.now();requestAnimationFrame(function i(o){var r=Math.min(1,(o-n)/t);e(r),r<1&&requestAnimationFrame(i)})},Scroller.prototype.gotop=function(){var e=document.getElementById("infinity-blog-title"),t=this;e&&(e.setAttribute("title",totop),e.addEventListener("click",function(e){var n=t.window.pageYOffset;e.preventDefault(),t.animate(function(e){var t=n-n*e;document.documentElement.scrollTop=document.body.scrollTop=t},200)}))},Scroller.prototype.thefooter=function(){var e,t,n,i,o=this;if(this.footer&&this.footer.el){if("string"==typeof this.footer.wrap){try{t=(t=document.getElementById(this.footer.wrap).getBoundingClientRect()).width}catch{t=0}t>479&&(e=this.footer.el.querySelector(".container"))&&(e.style.width=t+"px")}n=parseInt(o.footer.el.style.bottom||-50,10),i=this.window.pageYOffset>=350?0:-50,n!==i&&o.animate(function(e){var t=n+(i-n)*e;o.footer.el.style.bottom=t+"px",1===e&&(n=i)},200)}},Scroller.prototype.urlEncodeJSON=function(e,t){var n,i,o=[];for(var r in e)n=encodeURIComponent(r),i=t?t+"["+n+"]":n,"object"==typeof e[r]?!Array.isArray(e[r])||e[r].length>0?o.push(this.urlEncodeJSON(e[r],i)):o.push(i+"[]="):o.push(i+"="+encodeURIComponent(e[r]));return o.join("&")},Scroller.prototype.refresh=function(){var self=this,query,xhr,loader,customized;if(!this.disabled&&this.ready&&this.check())return this.ready=!1,this.click_handle&&(loader||(document.getElementById("infinite-aria").textContent=loading_text,loader=document.createElement("div"),loader.classList.add("infinite-loader"),loader.setAttribute("role","progress"),loader.innerHTML='<svg class="jetpack-spinner infinite-loader-spinner spinner" width="28" height="28" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indef
496inite"/></path></svg>'),this.element.appendChild(loader)),query=self.extend({action:"infinite_scroll"},this.query()),"undefined"!=typeof wp&&wp.customize&&wp.customize.settings.theme&&(customized={},query.wp_customize="on",query.theme=wp.customize.settings.theme.stylesheet,wp.customize.each(function(e){e._dirty&&(customized[e.id]=e())}),query.customized=JSON.stringify(customized),query.nonce=wp.customize.settings.nonce.preview),xhr=new XMLHttpRequest,xhr.open("POST",infiniteScroll.settings.ajaxurl,!0),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),xhr.send(self.urlEncodeJSON(query)),xhr.onerror=function(){self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader),self.ready=!0},xhr.onload=function(){var response=JSON.parse(xhr.responseText),httpCheck=xhr.status>=200&&xhr.status<300,responseCheck=void 0!==response.html;if(response&&httpCheck&&responseCheck){if(self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader),response.scripts&&Array.isArray(response.scripts)&&response.scripts.forEach(function(e){var t=e.footer?"body":"head";window.infiniteScroll.settings.scripts.push(e.handle),e.extra_data&&self.appendInlineScript(e.extra_data,t),e.before_handle&&self.appendInlineScript(e.before_handle,t);var n=document.createElement("script");n.type="text/javascript",n.src=e.src,n.id=e.handle,n.async=!1,e.after_handle&&(n.onload=function(){self.appendInlineScript(e.after_handle,t)}),"wp-mediaelement"===e.handle&&self.body.removeEventListener("is.post-load",self.initializeMejs),"wp-mediaelement"===e.handle&&"undefined"==typeof mejs?(self.wpMediaelement={},self.wpMediaelement.tag=n,self.wpMediaelement.element=t,setTimeout(self.maybeLoadMejs.bind(self),250)):document.getElementsByTagName(t)[0].appendChild(n)}),response.styles&&Array.isArray(response.styles)&&response.styles.forEach(function(item){window.infiniteScroll.settings.styles.push(item.handle);var style=document.createElement("link");style.rel="stylesheet",style.href=item.src,style.id=item.handle+"-css",!item.conditional||isIE&&eval(item.conditional.replace(/%ver/g,IEVersion))||(style=!1),style&&document.getElementsByTagName("head")[0].appendChild(style)}),response.fragment=document.createElement("div"),response.fragment.innerHTML=response.html,self.page++,stats&&((new Image).src=document.location.protocol+"//pixel.wp.com/g.gif?"+stats+"&post=0&baba="+Math.random()),"object"==typeof response.postflair&&"object"==typeof WPCOM_sharing_counts&&(WPCOM_sharing_counts=self.extend(WPCOM_sharing_counts,response.postflair)),self.render.call(self,response),"click"===type?(infiniteScroll.settings.wrapper&&document.querySelector("#infinite-view-"+(self.page+self.offset-1)+" a:first-of-type").focus({preventScroll:!0}),response.lastbatch?self.click_handle?(self.body.classList.add("infinity-end"),self.body.classList.remove("infinity-success")):self.trigger(this.body,"infinite-scroll-posts-end"):self.click_handle?self.element.appendChild(self.handle):self.trigger(this.body,"infinite-scroll-posts-more")):response.lastbatch&&(self.disabled=!0,self.body.classList.add("infinity-end"),self.body.classList.remove("infinity-success")),response.currentday&&(self.currentday=response.currentday),self.google_analytics){var ga_url=self.history.path.replace(/%d/,self.page);"object"==typeof _gaq&&_gaq.push(["_trackPageview",ga_url]),"function"==typeof ga&&ga("send","pageview",ga_url)}}else self.click_handle&&loader.parentNode&&loader.parentNode.removeChild(loader)},xhr},Scroller.prototype.appendInlineScript=function(e,t){var n=document.createElement("script"),i=document.createTextNode("//<![CDATA[ \n"+e+"\n//]]>");n.type="text/javascript",n.appendChild(i),document.getElementsByTagName(t)[0].appendChild(n)},Scroller.prototype.maybeLoadMejs=function(){null!==this.wpMediaelement&&("undefined"==typeof mejs?setTimeout(this.maybeLoadMejs.bind(this),250):(document.getElementsByTagName(this.wpMediaelement.element)[0].appendChild(this.wpMediaelement.tag),this.wpMediaelement=null,this.body.addEventListener("is.post-load",this.initializeMejs)))},Scroller.prototype.initializeMejs=function(e){if(e.detail&&e.detail.html&&(-1!==e.detail.html.indexOf("wp-audio-shortcode")||-1!==e.detail.html.indexOf("wp-video-shortcode"))&&"undefined"!=typeof mejs){var t,n={};"undefined"!=typeof _wpmejsSettings&&(n.pluginPath=_wpmejsSettings.pluginPath),n.success=function(e){var t=e.attributes.autoplay&&"false"!==e.attributes.autoplay;"flash"===e.pluginType&&t&&e.addEventListener("canplay",function(){e.play()},!1)},t=document.querySelectorAll(".wp-audio-shortcode, .wp-video-shortcode"),t=(t=Array.prototype.slice.call(t)).filter(function(e){for(;e.parentNode;){if(e.classList.contains("mejs-container"))return!1;e=e.parentNode}return!0});for(var i=0;i<t.length;i++)new MediaElementPlayer(t[i],n)}},Scroller.prototype.measure=function(e,t){t=t||[];for(var n,i,o,r=Array.prototype.slice.call(e.children),s=Number.MAX_VALUE,l=0;r.length>0;){for(n=r.shift(),o=0;o<t.length;o++)if(n.classList.contains(t[o])){r=r.concat(Array.prototype.slice.call(n.children));break}i=n.getBoundingClientRect(),s=Math.min(s,i.top),l=Math.max(l,i.bottom)}var a=Math.round(window.innerHeight/2),d=s<=a&&l>=a;return{top:s,bottom:l,height:l-s,factor:(Math.min(l,a)-Math.max(s,0))/a,isActive:d}},Scroller.prototype.ensureFilledViewport=function(){var e=this,t=e.window.innerHeight,n=e.measure(e.element,[e.wrapperClass]);e.body.removeEventListener("is.post-load",e.checkViewportOnLoadBound),0!==n.bottom&&n.bottom<t&&(e.ready=!0,e.refresh())},Scroller.prototype.checkViewportOnLoad=function(){this.ensureFilledViewport()};var previousFullScrenState=fullscreenState();Scroller.prototype.determineURL=function(){var e,t=this,n=-1,i=fullscreenState(),o=0;if(previousFullScrenState^i)previousFullScrenState=i;else{previousFullScrenState=i,e=document.querySelectorAll("."+t.wrapperClass);for(var r=0;r<e.length;r++){var s=t.measure(e[r]);if(s.isActive){n=parseInt(e[r].dataset.pageNum,10);break}s.factor>o&&(n=parseInt(e[r].dataset.pageNum,10),o=s.factor)}t.updateURL(n)}},Scroller.prototype.updateURL=function(e){if(window.history.pushState){var t=this,n=t.origURL;-1!==e&&(n=window.location.protocol+"//"+t.history.host+t.history.path.replace(/%d/,e)+t.history.parameters),window.location.href!==n&&history.pushState(null,null,n)}},Scroller.prototype.pause=function(){this.disabled=!0},Scroller.prototype.resume=function(){this.disabled=!1},Scroller.prototype.trigger=function(e,t,n){var i;(n=n||{}).jqueryEventName&&"undefined"!=typeof jQuery&&jQuery(e).trigger(n.jqueryEventName,n.data||null);try{i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n.data||null})}catch{(i=document.createEvent("CustomEvent")).initCustomEvent(t,!0,!0,n.data||null)}e.dispatchEvent(i)};var jetpackInfinityModule=function(){if("object"==typeof infiniteScroll&&(infiniteScroll.
496settings.body_class.split(" ").forEach(function(e){e&&document.body.classList.add(e)}),stats=infiniteScroll.settings.stats,type=infiniteScroll.settings.type,text=infiniteScroll.settings.text,totop=infiniteScroll.settings.totop,loading_text=infiniteScroll.settings.loading_text,infiniteScroll.scroller=new Scroller(infiniteScroll.settings),"click"===type)){var e=null;window.addEventListener("scroll",function(){e||(e=setTimeout(function(){infiniteScroll.scroller.determineURL(),e=null},250))})}};"interactive"===document.readyState||"complete"===document.readyState?jetpackInfinityModule():document.addEventListener("DOMContentLoaded",jetpackInfinityModule)})()})();;
497!function(e){var o={};function n(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=o,n.d=function(e,o,t){n.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,o){if(1&o&&(e=n(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var r in e)n.d(t,r,function(o){return e[o]}.bind(null,r));return t},n.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(o,"a",o),o},n.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},n.p="",n(n.s=273)}({273:function(e,o){!function(){"use strict";let e,o;function n(e){return new Promise((o,n)=>{const t=document.createElement("script");t.onload=()=>o(),t.onerror=e=>n(e),t.src=e,document.body.appendChild(t)})}function t(){if(e)return e;const o=window.wpcom_coblocks_js;return e=n(o.coblocks_lightbox_js),e}function r(){if(o)return o;window.wpcomJQueryUsageLoggerDisabled=!0;const e=window.wpcom_coblocks_js,t=window.jQuery?Promise.resolve():n(e.jquery_core_js).then(()=>n(e.jquery_migrate_js)),r=t.then(()=>window.imagesLoaded?Promise.resolve():n(e.imagesloaded_js)),c=t.then(()=>window.Masonry?Promise.resolve():n(e.masonry_js)),u=Promise.all([t,r,c]).then(()=>n(e.coblocks_masonry_js));return o=u,o}function c(){document.querySelector(".wp-block-coblocks-gallery-masonry")&&r(),document.querySelector(".has-lightbox")&&t(),document.body.classList.contains("block-editor-page")&&(r(),t())}"loading"!==document.readyState?c():document.addEventListener("DOMContentLoaded",c)}()}});;
498/**
499 * File skip-link-focus-fix.js.
500 *
501 * Helps with accessibility for keyboard only users.
502 *
503 * Learn more: https://git.io/vWdr2
504 */
505( function() {
506	var isWebkit = navigator.userAgent.toLowerCase().indexOf( 'webkit' ) > -1,
507	    isOpera  = navigator.userAgent.toLowerCase().indexOf( 'opera' )  > -1,
508	    isIe     = navigator.userAgent.toLowerCase().indexOf( 'msie' )   > -1;
509
510	if ( ( isWebkit || isOpera || isIe ) && document.getElementById && window.addEventListener ) {
511		window.addEventListener( 'hashchange', function() {
512			var id = location.hash.substring( 1 ),
513				element;
514
515			if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) {
516				return;
517			}
518
519			element = document.getElementById( id );
520
521			if ( element ) {
522				if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) {
523					element.tabIndex = -1;
524				}
525
526				element.focus();
527			}
528		}, false );
529	}
530})();;
531/*
532 * jQuery FlexSlider v2.4.0
533 * Copyright 2012 WooThemes
534 * Contributing Author: Tyler Smith
535 */
536;
537(function ($) {
538
539  //FlexSlider: Object Instance
540  $.flexslider = function(el, options) {
541    var slider = $(el);
542
543    // making variables public
544    slider.vars = $.extend({}, $.flexslider.defaults, options);
545
546    var namespace = slider.vars.namespace,
547        msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
548        touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
549        // depricating this idea, as devices are being released with both of these events
550        //eventType = (touch) ? "touchend" : "click",
551        eventType = "click touchend MSPointerUp keyup",
552        watchedEvent = "",
553        watchedEventClearTimer,
554        vertical = slider.vars.direction === "vertical",
555        reverse = slider.vars.reverse,
556        carousel = (slider.vars.itemWidth > 0),
557        fade = slider.vars.animation === "fade",
558        asNav = slider.vars.asNavFor !== "",
559        methods = {},
560        focused = true;
561
562    // Store a reference to the slider object
563    $.data(el, "flexslider", slider);
564
565    // Private slider methods
566    methods = {
567      init: function() {
568        slider.animating = false;
vendor: 45,927 bytes, lines 569-1631
569        // Get current slide and make sure it is a number
570        slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 );
571        if ( isNaN( slider.currentSlide ) ) { slider.currentSlide = 0; }
572        slider.animatingTo = slider.currentSlide;
573        slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
574        slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
575        slider.slides = $(slider.vars.selector, slider);
576        slider.container = $(slider.containerSelector, slider);
577        slider.count = slider.slides.length;
578        // SYNC:
579        slider.syncExists = $(slider.vars.sync).length > 0;
580        // SLIDE:
581        if (slider.vars.animation === "slide") { slider.vars.animation = "swing"; }
582        slider.prop = (vertical) ? "top" : "marginLeft";
583        slider.args = {};
584        // SLIDESHOW:
585        slider.manualPause = false;
586        slider.stopped = false;
587        //PAUSE WHEN INVISIBLE
588        slider.started = false;
589        slider.startTimeout = null;
590        // TOUCH/USECSS:
591        slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {
592          var obj = document.createElement('div'),
593              props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
594          for (var i in props) {
595            if ( obj.style[ props[i] ] !== undefined ) {
596              slider.pfx = props[i].replace('Perspective','').toLowerCase();
597              slider.prop = "-" + slider.pfx + "-transform";
598              return true;
599            }
600          }
601          return false;
602        }());
603        slider.ensureAnimationEnd = '';
604        // CONTROLSCONTAINER:
605        if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
606        // MANUAL:
607        if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);
608
609        // RANDOMIZE:
610        if (slider.vars.randomize) {
611          slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
612          slider.container.empty().append(slider.slides);
613        }
614
615        slider.doMath();
616
617        // INIT
618        slider.setup("init");
619
620        // CONTROLNAV:
621        if (slider.vars.controlNav) { methods.controlNav.setup(); }
622
623        // DIRECTIONNAV:
624        if (slider.vars.directionNav) { methods.directionNav.setup(); }
625
626        // KEYBOARD:
627        if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
628          $(document).bind('keyup', function(event) {
629            var keycode = event.keyCode;
630            if (!slider.animating && (keycode === 39 || keycode === 37)) {
631              var target = (keycode === 39) ? slider.getTarget('next') :
632                           (keycode === 37) ? slider.getTarget('prev') : false;
633              slider.flexAnimate(target, slider.vars.pauseOnAction);
634            }
635          });
636        }
637        // MOUSEWHEEL:
638        if (slider.vars.mousewheel) {
639          slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
640            event.preventDefault();
641            var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
642            slider.flexAnimate(target, slider.vars.pauseOnAction);
643          });
644        }
645
646        // PAUSEPLAY
647        if (slider.vars.pausePlay) { methods.pausePlay.setup(); }
648
649        //PAUSE WHEN INVISIBLE
650        if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible.init(); }
651
652        // SLIDSESHOW
653        if (slider.vars.slideshow) {
654          if (slider.vars.pauseOnHover) {
655            slider.hover(function() {
656              if (!slider.manualPlay && !slider.manualPause) { slider.pause(); }
657            }, function() {
658              if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); }
659            });
660          }
661          // initialize animation
662          //If we're visible, or we don't use PageVisibility API
663          if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
664            (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
665          }
666        }
667
668        // ASNAV:
669        if (asNav) { methods.asNav.setup(); }
670
671        // TOUCH
672        if (touch && slider.vars.touch) { methods.touch(); }
673
674        // FADE&&SMOOTHHEIGHT || SLIDE:
675        if (!fade || (fade && slider.vars.smoothHeight)) { $(window).bind("resize orientationchange focus", methods.resize); }
676
677        slider.find("img").attr("draggable", "false");
678
679        // API: start() Callback
680        setTimeout(function(){
681          slider.vars.start(slider);
682        }, 200);
683      },
684      asNav: {
685        setup: function() {
686          slider.asNav = true;
687          slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
688          slider.currentItem = slider.currentSlide;
689          slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
690          if(!msGesture){
691              slider.slides.on(eventType, function(e){
692                e.preventDefault();
693                var $slide = $(this),
694                    target = $slide.index();
695                var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
696                if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
697                  slider.flexAnimate(slider.getTarget("prev"), true);
698                } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
699                  slider.direction = (slider.currentItem < target) ? "next" : "prev";
700                  slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
701                }
702              });
703          }else{
704              el._slider = slider;
705              slider.slides.each(function (){
706                  var that = this;
707                  that._gesture = new MSGesture();
708                  that._gesture.target = that;
709                  that.addEventListener("MSPointerDown", function (e){
710                      e.preventDefault();
711                      if(e.currentTarget._gesture) {
712                        e.currentTarget._gesture.addPointer(e.pointerId);
713                      }
714                  }, false);
715                  that.addEventListener("MSGestureTap", function (e){
716                      e.preventDefault();
717                      var $slide = $(this),
718                          target = $slide.index();
719                      if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
720                          slider.direction = (slider.currentItem < target) ? "next" : "prev";
721                          slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
722                      }
723                  });
724              });
725          }
726        }
727      },
728      controlNav: {
729        setup: function() {
730          if (!slider.manualControls) {
731            methods.controlNav.setupPaging();
732          } else { // MANUALCONTROLS:
733            methods.controlNav.setupManual();
734          }
735        },
736        setupPaging: function() {
737          var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
738              j = 1,
739              item,
740              slide;
741
742          slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
743
744          if (slider.pagingCount > 1) {
745            for (var i = 0; i < slider.pagingCount; i++) {
746              slide = slider.slides.eq(i);
747
748              if ( undefined === slide.attr( 'data-thumb-alt' ) ) { 
749                slide.attr( 'data-thumb-alt', '' ); 
750              }
751              
752              item = $( '<a></a>' ).attr( 'href', '#' ).text( j );
753              if ( slider.vars.controlNav === "thumbnails" ) {
754                item = $( '<img/>' ).attr( 'src', slide.attr( 'data-thumb' ) );
755              }
756              
757              if ( '' !== slide.attr( 'data-thumb-alt' ) ) {
758                item.attr( 'alt', slide.attr( 'data-thumb-alt' ) );
759              }
760
761              if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
762                var captn = slide.attr( 'data-thumbcaption' );
763                if ( '' !== captn && undefined !== captn ) { 
764                  var caption = $('<span></span>' ).addClass( namespace + 'caption' ).text( captn );
765                  item.append( caption );
766                }
767              }
768              
769              var liElement = $( '<li>' );
770              item.appendTo( liElement );
771              liElement.append( '</li>' );
772
773              slider.controlNavScaffold.append(liElement);
774              j++;
775            }
776          }
777
778          // CONTROLSCONTAINER:
779          (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
780          methods.controlNav.set();
781
782          methods.controlNav.active();
783
784          slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
785            event.preventDefault();
786
787            if (watchedEvent === "" || watchedEvent === event.type) {
788              var $this = $(this),
789                  target = slider.controlNav.index($this);
790
791              if (!$this.hasClass(namespace + 'active')) {
792                slider.direction = (target > slider.currentSlide) ? "next" : "prev";
793                slider.flexAnimate(target, slider.vars.pauseOnAction);
794              }
795            }
796
797            // setup flags to prevent event duplication
798            if (watchedEvent === "") {
799              watchedEvent = event.type;
800            }
801            methods.setToClearWatchedEvent();
802
803          });
804        },
805        setupManual: function() {
806          slider.controlNav = slider.manualControls;
807          methods.controlNav.active();
808
809          slider.controlNav.bind(eventType, function(event) {
810            event.preventDefault();
811
812            if (watchedEvent === "" || watchedEvent === event.type) {
813              var $this = $(this),
814                  target = slider.controlNav.index($this);
815
816              if (!$this.hasClass(namespace + 'active')) {
817                (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
818                slider.flexAnimate(target, slider.vars.pauseOnAction);
819              }
820            }
821
822            // setup flags to prevent event duplication
823            if (watchedEvent === "") {
824              watchedEvent = event.type;
825            }
826            methods.setToClearWatchedEvent();
827          });
828        },
829        set: function() {
830          var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
831          slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
832        },
833        active: function() {
834          slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
835        },
836        update: function(action, pos) {
837          if (slider.pagingCount > 1 && action === "add") {
838            slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));
839          } else if (slider.pagingCount === 1) {
840            slider.controlNavScaffold.find('li').remove();
841          } else {
842            slider.controlNav.eq(pos).closest('li').remove();
843          }
844          methods.controlNav.set();
845          (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
846        }
847      },
848      directionNav: {
849        setup: function() {
850          var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li class="' + namespace + 'nav-prev"><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li class="' + namespace + 'nav-next"><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');
851
852          // CONTROLSCONTAINER:
853          if (slider.controlsContainer) {
854            $(slider.controlsContainer).append(directionNavScaffold);
855            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
856          } else {
857            slider.append(directionNavScaffold);
858            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
859          }
860
861          methods.directionNav.update();
862
863          slider.directionNav.bind(eventType, function(event) {
864            event.preventDefault();
865            var target;
866
867            if (watchedEvent === "" || watchedEvent === event.type) {
868              target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
869              slider.flexAnimate(target, slider.vars.pauseOnAction);
870            }
871
872            // setup flags to prevent event duplication
873            if (watchedEvent === "") {
874              watchedEvent = event.type;
875            }
876            methods.setToClearWatchedEvent();
877          });
878        },
879        update: function() {
880          var disabledClass = namespace + 'disabled';
881          if (slider.pagingCount === 1) {
882            slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
883          } else if (!slider.vars.animationLoop) {
884            if (slider.animatingTo === 0) {
885              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
886            } else if (slider.animatingTo === slider.last) {
887              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
888            } else {
889              slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
890            }
891          } else {
892            slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
893          }
894        }
895      },
896      pausePlay: {
897        setup: function() {
898          var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');
899
900          // CONTROLSCONTAINER:
901          if (slider.controlsContainer) {
902            slider.controlsContainer.append(pausePlayScaffold);
903            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
904          } else {
905            slider.append(pausePlayScaffold);
906            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
907          }
908
909          methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
910
911          slider.pausePlay.bind(eventType, function(event) {
912            event.preventDefault();
913
914            if (watchedEvent === "" || watchedEvent === event.type) {
915              if ($(this).hasClass(namespace + 'pause')) {
916                slider.manualPause = true;
917                slider.manualPlay = false;
918                slider.pause();
919              } else {
920                slider.manualPause = false;
921                slider.manualPlay = true;
922                slider.play();
923              }
924            }
925
926            // setup flags to prevent event duplication
927            if (watchedEvent === "") {
928              watchedEvent = event.type;
929            }
930            methods.setToClearWatchedEvent();
931          });
932        },
933        update: function(state) {
934          (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText);
935        }
936      },
937      touch: function() {
938        var startX,
939          startY,
940          offset,
941          cwidth,
942          dx,
943          startT,
944          scrolling = false,
945          localX = 0,
946          localY = 0,
947          accDx = 0;
948
949        if(!msGesture){
950            el.addEventListener('touchstart', onTouchStart, false);
951
952            function onTouchStart(e) {
953              if (slider.animating) {
954                e.preventDefault();
955              } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {
956                slider.pause();
957                // CAROUSEL:
958                cwidth = (vertical) ? slider.h : slider. w;
959                startT = Number(new Date());
960                // CAROUSEL:
961
962                // Local vars for X and Y points.
963                localX = e.touches[0].pageX;
964                localY = e.touches[0].pageY;
965
966                offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
967                         (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
968                         (carousel && slider.currentSlide === slider.last) ? slider.limit :
969                         (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
970                         (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
971                startX = (vertical) ? localY : localX;
972                startY = (vertical) ? localX : localY;
973
974                el.addEventListener('touchmove', onTouchMove, false);
975                el.addEventListener('touchend', onTouchEnd, false);
976              }
977            }
978
979            function onTouchMove(e) {
980              // Local vars for X and Y points.
981
982              localX = e.touches[0].pageX;
983              localY = e.touches[0].pageY;
984
985              dx = (vertical) ? startX - localY : startX - localX;
986              scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
987
988              var fxms = 500;
989
990              if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
991                e.preventDefault();
992                if (!fade && slider.transitions) {
993                  if (!slider.vars.animationLoop) {
994                    dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
995                  }
996                  slider.setProps(offset + dx, "setTouch");
997                }
998              }
999            }
1000
1001            function onTouchEnd(e) {
1002              // finish the touch by undoing the touch session
1003              el.removeEventListener('touchmove', onTouchMove, false);
1004
1005              if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
1006                var updateDx = (reverse) ? -dx : dx,
1007                    target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
1008
1009                if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
1010                  slider.flexAnimate(target, slider.vars.pauseOnAction);
1011                } else {
1012                  if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
1013                }
1014              }
1015              el.removeEventListener('touchend', onTouchEnd, false);
1016
1017              startX = null;
1018              startY = null;
1019              dx = null;
1020              offset = null;
1021            }
1022        }else{
1023            el.style.msTouchAction = "none";
1024            el._gesture = new MSGesture();
1025            el._gesture.target = el;
1026            el.addEventListener("MSPointerDown", onMSPointerDown, false);
1027            el._slider = slider;
1028            el.addEventListener("MSGestureChange", onMSGestureChange, false);
1029            el.addEventListener("MSGestureEnd", onMSGestureEnd, false);
1030
1031            function onMSPointerDown(e){
1032                e.stopPropagation();
1033                if (slider.animating) {
1034                    e.preventDefault();
1035                }else{
1036                    slider.pause();
1037                    el._gesture.addPointer(e.pointerId);
1038                    accDx = 0;
1039                    cwidth = (vertical) ? slider.h : slider. w;
1040                    startT = Number(new Date());
1041                    // CAROUSEL:
1042
1043                    offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
1044                        (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
1045                            (carousel && slider.currentSlide === slider.last) ? slider.limit :
1046                                (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
1047                                    (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
1048                }
1049            }
1050
1051            function onMSGestureChange(e) {
1052                e.stopPropagation();
1053                var slider = e.target._slider;
1054                if(!slider){
1055                    return;
1056                }
1057                var transX = -e.translationX,
1058                    transY = -e.translationY;
1059
1060                //Accumulate translations.
1061                accDx = accDx + ((vertical) ? transY : transX);
1062                dx = accDx;
1063                scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));
1064
1065                if(e.detail === e.MSGESTURE_FLAG_INERTIA){
1066                    setImmediate(function (){
1067                        el._gesture.stop();
1068                    });
1069
1070                    return;
1071                }
1072
1073                if (!scrolling || Number(new Date()) - startT > 500) {
1074                    e.preventDefault();
1075                    if (!fade && slider.transitions) {
1076                        if (!slider.vars.animationLoop) {
1077                            dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);
1078                        }
1079                        slider.setProps(offset + dx, "setTouch");
1080                    }
1081                }
1082            }
1083
1084            function onMSGestureEnd(e) {
1085                e.stopPropagation();
1086                var slider = e.target._slider;
1087                if(!slider){
1088                    return;
1089                }
1090                if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
1091                    var updateDx = (reverse) ? -dx : dx,
1092                        target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
1093
1094                    if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
1095                        slider.flexAnimate(target, slider.vars.pauseOnAction);
1096                    } else {
1097                        if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
1098                    }
1099                }
1100
1101                startX = null;
1102                startY = null;
1103                dx = null;
1104                offset = null;
1105                accDx = 0;
1106            }
1107        }
1108      },
1109      resize: function() {
1110        if (!slider.animating && slider.is(':visible')) {
1111          if (!carousel) { slider.doMath(); }
1112
1113          if (fade) {
1114            // SMOOTH HEIGHT:
1115            methods.smoothHeight();
1116          } else if (carousel) { //CAROUSEL:
1117            slider.slides.width(slider.computedW);
1118            slider.update(slider.pagingCount);
1119            slider.setProps();
1120          }
1121          else if (vertical) { //VERTICAL:
1122            slider.viewport.height(slider.h);
1123            slider.setProps(slider.h, "setTotal");
1124          } else {
1125            // SMOOTH HEIGHT:
1126            if (slider.vars.smoothHeight) { methods.smoothHeight(); }
1127            slider.newSlides.width(slider.computedW);
1128            slider.setProps(slider.computedW, "setTotal");
1129          }
1130        }
1131      },
1132      smoothHeight: function(dur) {
1133        if (!vertical || fade) {
1134          var $obj = (fade) ? slider : slider.viewport;
1135          (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());
1136        }
1137      },
1138      sync: function(action) {
1139        var $obj = $(slider.vars.sync).data("flexslider"),
1140            target = slider.animatingTo;
1141
1142        switch (action) {
1143          case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
1144          case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
1145          case "pause": $obj.pause(); break;
1146        }
1147      },
1148      uniqueID: function($clone) {
1149        // Append _clone to current level and children elements with id attributes
1150        $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
1151          var $this = $(this);
1152          $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
1153        });
1154        return $clone;
1155      },
1156      pauseInvisible: {
1157        visProp: null,
1158        init: function() {
1159          var visProp = methods.pauseInvisible.getHiddenProp();
1160          if (visProp) {
1161            var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
1162            document.addEventListener(evtname, function() {
1163              if (methods.pauseInvisible.isHidden()) {
1164                if(slider.startTimeout) {
1165                  clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
1166                } else { 
1167                  slider.pause(); //Or just pause
1168                }
1169              }
1170              else {
1171                if(slider.started) {
1172                  slider.play(); //Initiated before, just play
1173                } else { 
1174                  if (slider.vars.initDelay > 0) { 
1175                    setTimeout(slider.play, slider.vars.initDelay);
1176                  } else {
1177                    slider.play(); //Didn't init before: simply init or wait for it
1178                  } 
1179                }
1180              }
1181            });
1182          }
1183        },
1184        isHidden: function() {
1185          var prop = methods.pauseInvisible.getHiddenProp();
1186          if (!prop) {
1187            return false;
1188          }
1189          return document[prop];
1190        },
1191        getHiddenProp: function() {
1192          var prefixes = ['webkit','moz','ms','o'];
1193          // if 'hidden' is natively supported just return it
1194          if ('hidden' in document) {
1195            return 'hidden';
1196          }
1197          // otherwise loop over all the known prefixes until we find one
1198          for ( var i = 0; i < prefixes.length; i++ ) {
1199              if ((prefixes[i] + 'Hidden') in document) {
1200                return prefixes[i] + 'Hidden';
1201              }
1202          }
1203          // otherwise it's not supported
1204          return null;
1205        }
1206      },
1207      setToClearWatchedEvent: function() {
1208        clearTimeout(watchedEventClearTimer);
1209        watchedEventClearTimer = setTimeout(function() {
1210          watchedEvent = "";
1211        }, 3000);
1212      }
1213    };
1214
1215    // public methods
1216    slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
1217      if (!slider.vars.animationLoop && target !== slider.currentSlide) {
1218        slider.direction = (target > slider.currentSlide) ? "next" : "prev";
1219      }
1220
1221      if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
1222
1223      if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
1224        if (asNav && withSync) {
1225          var master = $(slider.vars.asNavFor).data('flexslider');
1226          slider.atEnd = target === 0 || target === slider.count - 1;
1227          master.flexAnimate(target, true, false, true, fromNav);
1228          slider.direction = (slider.currentItem < target) ? "next" : "prev";
1229          master.direction = slider.direction;
1230
1231          if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
1232            slider.currentItem = target;
1233            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
1234            target = Math.floor(target/slider.visible);
1235          } else {
1236            slider.currentItem = target;
1237            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
1238            return false;
1239          }
1240        }
1241
1242        slider.animating = true;
1243        slider.animatingTo = target;
1244
1245        // SLIDESHOW:
1246        if (pause) { slider.pause(); }
1247
1248        // API: before() animation Callback
1249        slider.vars.before(slider);
1250
1251        // SYNC:
1252        if (slider.syncExists && !fromNav) { methods.sync("animate"); }
1253
1254        // CONTROLNAV
1255        if (slider.vars.controlNav) { methods.controlNav.active(); }
1256
1257        // !CAROUSEL:
1258        // CANDIDATE: slide active class (for add/remove slide)
1259        if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
1260
1261        // INFINITE LOOP:
1262        // CANDIDATE: atEnd
1263        slider.atEnd = target === 0 || target === slider.last;
1264
1265        // DIRECTIONNAV:
1266        if (slider.vars.directionNav) { methods.directionNav.update(); }
1267
1268        if (target === slider.last) {
1269          // API: end() of cycle Callback
1270          slider.vars.end(slider);
1271          // SLIDESHOW && !INFINITE LOOP:
1272          if (!slider.vars.animationLoop) { slider.pause(); }
1273        }
1274
1275        // SLIDE:
1276        if (!fade) {
1277          var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
1278              margin, slideString, calcNext;
1279
1280          // INFINITE LOOP / REVERSE:
1281          if (carousel) {
1282            //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin;
1283            margin = slider.vars.itemMargin;
1284            calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
1285            slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
1286          } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
1287            slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
1288          } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
1289            slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
1290          } else {
1291            slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
1292          }
1293          slider.setProps(slideString, "", slider.vars.animationSpeed);
1294          if (slider.transitions) {
1295            if (!slider.vars.animationLoop || !slider.atEnd) {
1296              slider.animating = false;
1297              slider.currentSlide = slider.animatingTo;
1298            }
1299            
1300            // Unbind previous transitionEnd events and re-bind new transitionEnd event
1301            slider.container.unbind("webkitTransitionEnd transitionend");
1302            slider.container.bind("webkitTransitionEnd transitionend", function() {
1303              clearTimeout(slider.ensureAnimationEnd);
1304              slider.wrapup(dimension);
1305            });
1306
1307            // Insurance for the ever-so-fickle transitionEnd event
1308            clearTimeout(slider.ensureAnimationEnd);
1309            slider.ensureAnimationEnd = setTimeout(function() {
1310              slider.wrapup(dimension);
1311            }, slider.vars.animationSpeed + 100);
1312
1313          } else {
1314            slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){
1315              slider.wrapup(dimension);
1316            });
1317          }
1318        } else { // FADE:
1319          if (!touch) {
1320            //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing);
1321            //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
1322
1323            slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
1324            slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
1325
1326          } else {
1327            slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
1328            slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
1329            slider.wrapup(dimension);
1330          }
1331        }
1332        // SMOOTH HEIGHT:
1333        if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); }
1334      }
1335    };
1336    slider.wrapup = function(dimension) {
1337      // SLIDE:
1338      if (!fade && !carousel) {
1339        if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
1340          slider.setProps(dimension, "jumpEnd");
1341        } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
1342          slider.setProps(dimension, "jumpStart");
1343        }
1344      }
1345      slider.animating = false;
1346      slider.currentSlide = slider.animatingTo;
1347      // API: after() animation Callback
1348      slider.vars.after(slider);
1349    };
1350
1351    // SLIDESHOW:
1352    slider.animateSlides = function() {
1353      if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); }
1354    };
1355    // SLIDESHOW:
1356    slider.pause = function() {
1357      clearInterval(slider.animatedSlides);
1358      slider.animatedSlides = null;
1359      slider.playing = false;
1360      // PAUSEPLAY:
1361      if (slider.vars.pausePlay) { methods.pausePlay.update("play"); }
1362      // SYNC:
1363      if (slider.syncExists) { methods.sync("pause"); }
1364    };
1365    // SLIDESHOW:
1366    slider.play = function() {
1367      if (slider.playing) { clearInterval(slider.animatedSlides); }
1368      slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
1369      slider.started = slider.playing = true;
1370      // PAUSEPLAY:
1371      if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); }
1372      // SYNC:
1373      if (slider.syncExists) { methods.sync("play"); }
1374    };
1375    // STOP:
1376    slider.stop = function () {
1377      slider.pause();
1378      slider.stopped = true;
1379    };
1380    slider.canAdvance = function(target, fromNav) {
1381      // ASNAV:
1382      var last = (asNav) ? slider.pagingCount - 1 : slider.last;
1383      return (fromNav) ? true :
1384             (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
1385             (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
1386             (target === slider.currentSlide && !asNav) ? false :
1387             (slider.vars.animationLoop) ? true :
1388             (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
1389             (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
1390             true;
1391    };
1392    slider.getTarget = function(dir) {
1393      slider.direction = dir;
1394      if (dir === "next") {
1395        return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
1396      } else {
1397        return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
1398      }
1399    };
1400
1401    // SLIDE:
1402    slider.setProps = function(pos, special, dur) {
1403      var target = (function() {
1404        var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
1405            posCalc = (function() {
1406              if (carousel) {
1407                return (special === "setTouch") ? pos :
1408                       (reverse && slider.animatingTo === slider.last) ? 0 :
1409                       (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
1410                       (slider.animatingTo === slider.last) ? slider.limit : posCheck;
1411              } else {
1412                switch (special) {
1413                  case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
1414                  case "setTouch": return (reverse) ? pos : pos;
1415                  case "jumpEnd": return (reverse) ? pos : slider.count * pos;
1416                  case "jumpStart": return (reverse) ? slider.count * pos : pos;
1417                  default: return pos;
1418                }
1419              }
1420            }());
1421
1422            return (posCalc * -1) + "px";
1423          }());
1424
1425      if (slider.transitions) {
1426        target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
1427        dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
1428        slider.container.css("-" + slider.pfx + "-transition-duration", dur);
1429         slider.container.css("transition-duration", dur);
1430      }
1431
1432      slider.args[slider.prop] = target;
1433      if (slider.transitions || dur === undefined) { slider.container.css(slider.args); }
1434
1435      slider.container.css('transform',target);
1436    };
1437
1438    slider.setup = function(type) {
1439      // SLIDE:
1440      if (!fade) {
1441        var sliderOffset, arr;
1442
1443        if (type === "init") {
1444          slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
1445          // INFINITE LOOP:
1446          slider.cloneCount = 0;
1447          slider.cloneOffset = 0;
1448          // REVERSE:
1449          if (reverse) {
1450            arr = $.makeArray(slider.slides).reverse();
1451            slider.slides = $(arr);
1452            slider.container.empty().append(slider.slides);
1453          }
1454        }
1455        // INFINITE LOOP && !CAROUSEL:
1456        if (slider.vars.animationLoop && !carousel) {
1457          slider.cloneCount = 2;
1458          slider.cloneOffset = 1;
1459          // clear out old clones
1460          if (type !== "init") { slider.container.find('.clone').remove(); }
1461          slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
1462                          .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
1463        }
1464        slider.newSlides = $(slider.vars.selector, slider);
1465
1466        sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
1467        // VERTICAL:
1468        if (vertical && !carousel) {
1469          slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
1470          setTimeout(function(){
1471            slider.newSlides.css({"display": "block"});
1472            slider.doMath();
1473            slider.viewport.height(slider.h);
1474            slider.setProps(sliderOffset * slider.h, "init");
1475          }, (type === "init") ? 100 : 0);
1476        } else {
1477          slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
1478          slider.setProps(sliderOffset * slider.computedW, "init");
1479          setTimeout(function(){
1480            slider.doMath();
1481            slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
1482            // SMOOTH HEIGHT:
1483            if (slider.vars.smoothHeight) { methods.smoothHeight(); }
1484          }, (type === "init") ? 100 : 0);
1485        }
1486      } else { // FADE:
1487        slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
1488        if (type === "init") {
1489          if (!touch) {
1490            //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
1491            if (slider.vars.fadeFirstSlide == false) {
1492              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
1493            } else {
1494              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
1495            }
1496          } else {
1497            slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
1498          }
1499        }
1500        // SMOOTH HEIGHT:
1501        if (slider.vars.smoothHeight) { methods.smoothHeight(); }
1502      }
1503      // !CAROUSEL:
1504      // CANDIDATE: active slide
1505      if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
1506
1507      //FlexSlider: init() Callback
1508      slider.vars.init(slider);
1509    };
1510
1511    slider.doMath = function() {
1512      var slide = slider.slides.first(),
1513          slideMargin = slider.vars.itemMargin,
1514          minItems = slider.vars.minItems,
1515          maxItems = slider.vars.maxItems;
1516
1517      slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
1518      slider.h = slide.height();
1519      slider.boxPadding = slide.outerWidth() - slide.width();
1520
1521      // CAROUSEL:
1522      if (carousel) {
1523        slider.itemT = slider.vars.itemWidth + slideMargin;
1524        slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
1525        slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
1526        slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
1527                       (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
1528                       (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
1529
1530        slider.visible = Math.floor(slider.w/(slider.itemW));
1531        slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
1532        slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
1533        slider.last =  slider.pagingCount - 1;
1534        slider.limit = (slider.pagingCount === 1) ? 0 :
1535                       (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
1536      } else {
1537        slider.itemW = slider.w;
1538        slider.pagingCount = slider.count;
1539        slider.last = slider.count - 1;
1540      }
1541      slider.computedW = slider.itemW - slider.boxPadding;
1542    };
1543
1544    slider.update = function(pos, action) {
1545      slider.doMath();
1546
1547      // update currentSlide and slider.animatingTo if necessary
1548      if (!carousel) {
1549        if (pos < slider.currentSlide) {
1550          slider.currentSlide += 1;
1551        } else if (pos <= slider.currentSlide && pos !== 0) {
1552          slider.currentSlide -= 1;
1553        }
1554        slider.animatingTo = slider.currentSlide;
1555      }
1556
1557      // update controlNav
1558      if (slider.vars.controlNav && !slider.manualControls) {
1559        if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
1560          methods.controlNav.update("add");
1561        } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
1562          if (carousel && slider.currentSlide > slider.last) {
1563            slider.currentSlide -= 1;
1564            slider.animatingTo -= 1;
1565          }
1566          methods.controlNav.update("remove", slider.last);
1567        }
1568      }
1569      // update directionNav
1570      if (slider.vars.directionNav) { methods.directionNav.update(); }
1571
1572    };
1573
1574    slider.addSlide = function(obj, pos) {
1575      var $obj = $(obj);
1576
1577      slider.count += 1;
1578      slider.last = slider.count - 1;
1579
1580      // append new slide
1581      if (vertical && reverse) {
1582        (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
1583      } else {
1584        (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
1585      }
1586
1587      // update currentSlide, animatingTo, controlNav, and directionNav
1588      slider.update(pos, "add");
1589
1590      // update slider.slides
1591      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1592      // re-setup the slider to accomdate new slide
1593      slider.setup();
1594
1595      //FlexSlider: added() Callback
1596      slider.vars.added(slider);
1597    };
1598    slider.removeSlide = function(obj) {
1599      var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
1600
1601      // update count
1602      slider.count -= 1;
1603      slider.last = slider.count - 1;
1604
1605      // remove slide
1606      if (isNaN(obj)) {
1607        $(obj, slider.slides).remove();
1608      } else {
1609        (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
1610      }
1611
1612      // update currentSlide, animatingTo, controlNav, and directionNav
1613      slider.doMath();
1614      slider.update(pos, "remove");
1615
1616      // update slider.slides
1617      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1618      // re-setup the slider to accomdate new slide
1619      slider.setup();
1620
1621      // FlexSlider: removed() Callback
1622      slider.vars.removed(slider);
1623    };
1624
1625    //FlexSlider: Initialize
1626    methods.init();
1627  };
1628
1629  // Ensure the slider isn't focussed if the window loses focus.
1630  $( window ).blur( function ( e ) {
1631    focused = false;
1632  }).focus( function ( e ) {
1633    focused = true;
1634  });
1635
1636  //FlexSlider: Default Settings
1637  $.flexslider.defaults = {
1638    namespace: "flex-",             //{NEW} String: Prefix string attached to the class of every element generated by the plugin
1639    selector: ".slides > li",       //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
1640    animation: "fade",              //String: Select your animation type, "fade" or "slide"
1641    easing: "swing",                //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
1642    direction: "horizontal",        //String: Select the sliding direction, "horizontal" or "vertical"
1643    reverse: false,                 //{NEW} Boolean: Reverse the animation direction
1644    animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1645    smoothHeight: false,            //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1646    startAt: 0,                     //Integer: The slide that the slider should start on. Array notation (0 = first slide)
1647    slideshow: true,                //Boolean: Animate slider automatically
1648    slideshowSpeed: 7000,           //Integer: Set the speed of the slideshow cycling, in milliseconds
1649    animationSpeed: 600,            //Integer: Set the speed of animations, in milliseconds
1650    initDelay: 0,                   //{NEW} Integer: Set an initialization delay, in milliseconds
1651    randomize: false,               //Boolean: Randomize slide order
1652    fadeFirstSlide: true,           //Boolean: Fade in the first slide when animation type is "fade"
1653    thumbCaptions: false,           //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1654
1655    // Usability features
1656    pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1657    pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1658    pauseInvisible: true,   		//{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
1659    useCSS: true,                   //{NEW} Boolean: Slider will use CSS3 transitions if available
1660    touch: true,                    //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
1661    video: false,                   //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
1662
1663    // Primary Controls
1664    controlNav: true,               //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
1665    directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)
1666    prevText: "Previous",           //String: Set the text for the "previous" directionNav item
1667    nextText: "Next",               //String: Set the text for the "next" directionNav item
1668
1669    // Secondary Navigation
1670    keyboard: true,                 //Boolean: Allow slider navigating via keyboard left/right keys
1671    multipleKeyboard: false,        //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
1672    mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1673    pausePlay: false,               //Boolean: Create pause/play dynamic element
1674    pauseText: "Pause",             //String: Set the text for the "pause" pausePlay item
1675    playText: "Play",               //String: Set the text for the "play" pausePlay item
1676
1677    // Special properties
1678    controlsContainer: "",          //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found.
1679    manualControls: "",             //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
1680    sync: "",                       //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
1681    asNavFor: "",                   //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
1682
1683    // Carousel Options
1684    itemWidth: 0,                   //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
1685    itemMargin: 0,                  //{NEW} Integer: Margin between carousel items.
1686    minItems: 1,                    //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1687    maxItems: 0,                    //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
1688    move: 0,                        //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
1689    allowOneSlide: true,           //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1690
1691    // Callback API
1692    start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide
1693    before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation
1694    after: function(){},            //Callback: function(slider) - Fires after each slider animation completes
1695    end: function(){},              //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
1696    added: function(){},            //{NEW} Callback: function(slider) - Fires after a slide is added
1697    removed: function(){},           //{NEW} Callback: function(slider) - Fires after a slide is removed
1698    init: function() {}             //{NEW}
1698 Callback: function(slider) - Fires after the slider is initially setup
1699  };
1700
1701  //FlexSlider: Plugin Function
1702  $.fn.flexslider = function(options) {
1703    if (options === undefined) { options = {}; }
1704
1705    if (typeof options === "object") {
1706      return this.each(function() {
1707        var $this = $(this),
1708            selector = (options.selector) ? options.selector : ".slides > li",
1709            $slides = $this.find(selector);
1710
1711      if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) {
1712          $slides.fadeIn(400);
1713          if (options.start) { options.start($this); }
1714        } else if ($this.data('flexslider') === undefined) {
1715          new $.flexslider(this, options);
1716        }
1717      });
1718    } else {
1719      // Helper strings to quickly perform functions on the slider
1720      var $slider = $(this).data('flexslider');
1721      switch (options) {
1722        case "play": $slider.play(); break;
1723        case "pause": $slider.pause(); break;
1724        case "stop": $slider.stop(); break;
1725        case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
1726        case "prev":
1727        case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
1728        default: if (typeof options === "number") { $slider.flexAnimate(options, true); }
1729      }
1730    }
1731  };
1732})(jQuery);
1733;
1734/*
1735	By Osvaldas Valutis, www.osvaldas.info
1736	Available for use under the MIT License
1737*/
1738
1739
1740
1741;(function( $, window, document, undefined )
1742{
1743	$.fn.doubleTapToGo = function( params )
1744	{
1745		if( !( 'ontouchstart' in window ) &&
1746			!navigator.msMaxTouchPoints &&
1747			!navigator.userAgent.toLowerCase().match( /windows phone os 7/i ) ) return false;
1748
1749		this.each( function()
1750		{
1751			var curItem = false;
1752
1753			$( this ).on( 'click', function( e )
1754			{
1755				var item = $( this );
1756				if( item[ 0 ] != curItem[ 0 ] )
1757				{
1758					e.preventDefault();
1759					curItem = item;
1760				}
1761			});
1762
1763			$( document ).on( 'click touchstart MSPointerDown', function( e )
1764			{
1765				var resetItem = true,
1766					parents	= $( e.target ).parents();
1767
1768				for( var i = 0; i < parents.length; i++ )
1769					if( parents[ i ] == curItem[ 0 ] )
1770						resetItem = false;
1771
1772				if( resetItem )
1773					curItem = false;
1774			});
1775		});
1776		return this;
1777	};
1778})( jQuery, window, document );;
1779/**
1780 * global.js
1781 *
1782 * Handles various UI actions
1783 * - Mobile menu
1784 * - Search form show/hide
1785 * - Touch device dropdowns (requires: doubletaptogo.js)
1786 * - Flexslider (requires: flexslider.js)
1787 * - Scroll to top
1788 * - Smooth page load
1789 *
1790 * @package Rowling
1791 */
1792( function( $ ) {
1793
1794/**
1795 * On ready
1796 */
1797	$( document ).ready( function() {
1798		var windowWidth = $( window ).width();
1799
1800
1801		// Toggle mobile menu
1802		$( ".nav-toggle" ).on( "click", function() {
1803			$( this ).toggleClass( "active" );
1804			$( ".header-bottom-menu" ).slideToggle();
1805			if ( $( ".search-toggle" ).hasClass( "active" ) ) {
1806				$( ".search-toggle" ).removeClass( "active" );
1807				$( ".search-container" ).slideToggle();
1808			}
1809			return false;
1810		});
1811
1812
1813		// Toggle search container
1814		$( ".search-toggle" ).on( "click", function() {
1815			$( this ).toggleClass( "active" );
1816			$( ".search-container" ).slideToggle();
1817			if ( $( ".nav-toggle" ).hasClass( "active" ) ) {
1818				$( ".nav-toggle" ).removeClass( "active" );
1819				$( ".header-bottom-menu" ).slideToggle();
1820			}
1821			return false;
1822		});
1823
1824		$( window ).resize( function() {
1825
1826			// Prevent the Android keyboard from triggering the following code
1827			if ( windowWidth !== $( window ).width() ) {
1828
1829				// Hide mobile menu/search container at resize
1830				if ( $(window).width() >= 851 ) {
1831					$( ".nav-toggle" ).removeClass( "active" );
1832					$( ".header-bottom-menu" ).show();
1833				}
1834
1835				if ( $(window).width() <= 850 ) {
1836					$( ".search-toggle" ).removeClass( "active" );
1837					$( ".search-container" ).hide();
1838				}
1839
1840				// Dropdown menus on touch devices, excluding mobile menu
1841				if ( $(window).width() <= 851 ) {
1842					$( ".header-bottom-menu li:has(ul)" ).doubleTapToGo();
1843					$( ".header-top-menu li:has(ul)" ).doubleTapToGo();
1844				}
1845
1846				if ( $(window).width() >= 850 ) {
1847					$( ".header-bottom-menu li:has(ul)" ).unbind();
1848					$( ".header-top-menu li:has(ul)" ).unbind();
1849				}
1850			}
1851
1852			windowWidth = $( window ).width();
1853
1854		}).resize();
1855
1856		// Load Flexslider
1857		$( ".flexslider" ).flexslider( {
1858			animation: "slide",
1859			controlNav: false,
1860			prevText: "",
1861			nextText: "",
1862			smoothHeight: true
1863		});
1864
1865		// smooth scroll to the top
1866		$( ".to-the-top" ).click( function() {
1867			$( "html, body" ).animate( { scrollTop: 0 }, 500 );
1868				return false;
1869		});
1870
1871	});
1872
1873
1874	/**
1875	 * On load
1876	 */
1877	$( document.body ).on( 'post-load', function () {
1878
1879		// Load Flexslider after new posts have been added to the page.
1880		$( ".flexslider" ).flexslider( {
1881			animation: "slide",
1882			controlNav: false,
1883			prevText: "",
1884			nextText: "",
1885			smoothHeight: true
1886		});
1887
1888	});
1889
1890} ) ( jQuery );
1891;
1892(()=>{var e={8885(e,t,o){(e=o.nmd(e))&&(e.exports=function(){var e,t="en",o=/[?&#]lang=([a-zA-Z\-_]+)/;"object"==typeof _wp_google_translate_widget&&"string"==typeof _wp_google_translate_widget.lang&&(t=_wp_google_translate_widget.lang),(e=window.location.href.match(o))&&(window.location.href=window.location.href.replace(o,"").replace(/#googtrans\([a-zA-Z\-_|]+\)/,"")+"#googtrans("+t+"|"+e[1]+")"),new google.translate.TranslateElement({pageLanguage:t,layout:_wp_google_translate_widget.layout,autoDisplay:!1},"google_translate_element")})}};const t={};function o(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={id:a,loaded:!1,exports:{}};return e[a](l,l.exports,o),l.loaded=!0,l.exports}o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);let a=o(8885);googleTranslateElementInit=a})();;

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.