diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/reveal.js | 635 | ||||
-rw-r--r-- | js/reveal.min.js | 4 |
2 files changed, 425 insertions, 214 deletions
diff --git a/js/reveal.js b/js/reveal.js index 676122f..e7860ff 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -59,6 +59,10 @@ var Reveal = (function(){ // Turns fragments on and off globally fragments: true, + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + // Number of milliseconds between automatically proceeding to the // next slide, disabled when set to 0, this value can be overwritten // by using a data-autoslide attribute on your slides @@ -68,7 +72,7 @@ var Reveal = (function(){ mouseWheel: false, // Apply a 3D roll to links on hover - rollingLinks: true, + rollingLinks: false, // Opens links in an iframe preview overlay previewLinks: false, @@ -83,18 +87,24 @@ var Reveal = (function(){ transitionSpeed: 'default', // default/fast/slow // Transition style for full page slide backgrounds - backgroundTransition: 'default', // default/linear + backgroundTransition: 'default', // default/linear/none + + // Number of slides away from the current that are visible + viewDistance: 3, // Script dependencies to load dependencies: [] }, + // Flags if reveal.js is loaded (has dispatched the 'ready' event) + loaded = false, + // The current auto-slide duration autoSlide = 0, // The horizontal and vertical index of the currently active slide - indexh = 0, - indexv = 0, + indexh, + indexv, // The previous and current slide HTML elements previousSlide, @@ -111,19 +121,14 @@ var Reveal = (function(){ // Cached references to DOM elements dom = {}, - // Detect support for CSS 3D transforms - supports3DTransforms = 'WebkitPerspective' in document.body.style || - 'MozPerspective' in document.body.style || - 'msPerspective' in document.body.style || - 'OPerspective' in document.body.style || - 'perspective' in document.body.style, + // Client support for CSS 3D transforms, see #checkCapabilities() + supports3DTransforms, - // Detect support for CSS 2D transforms - supports2DTransforms = 'WebkitTransform' in document.body.style || - 'MozTransform' in document.body.style || - 'msTransform' in document.body.style || - 'OTransform' in document.body.style || - 'transform' in document.body.style, + // Client support for CSS 2D transforms, see #checkCapabilities() + supports2DTransforms, + + // Client is a mobile device, see #checkCapabilities() + isMobileDevice, // Throttles mouse wheel navigation lastMouseWheelStep = 0, @@ -149,8 +154,8 @@ var Reveal = (function(){ startY: 0, startSpan: 0, startCount: 0, - handled: false, - threshold: 80 + captured: false, + threshold: 40 }; /** @@ -158,6 +163,8 @@ var Reveal = (function(){ */ function initialize( options ) { + checkCapabilities(); + if( !supports2DTransforms && !supports3DTransforms ) { document.body.setAttribute( 'class', 'no-transforms' ); @@ -181,6 +188,136 @@ var Reveal = (function(){ } /** + * Inspect the client to see what it's capable of, this + * should only happens once per runtime. + */ + function checkCapabilities() { + + supports3DTransforms = 'WebkitPerspective' in document.body.style || + 'MozPerspective' in document.body.style || + 'msPerspective' in document.body.style || + 'OPerspective' in document.body.style || + 'perspective' in document.body.style; + + supports2DTransforms = 'WebkitTransform' in document.body.style || + 'MozTransform' in document.body.style || + 'msTransform' in document.body.style || + 'OTransform' in document.body.style || + 'transform' in document.body.style; + + isMobileDevice = navigator.userAgent.match( /(iphone|ipod|android)/gi ); + + } + + /** + * Loads the dependencies of reveal.js. Dependencies are + * defined via the configuration option 'dependencies' + * and will be loaded prior to starting/binding reveal.js. + * Some dependencies may have an 'async' flag, if so they + * will load after reveal.js has been started up. + */ + function load() { + + var scripts = [], + scriptsAsync = []; + + for( var i = 0, len = config.dependencies.length; i < len; i++ ) { + var s = config.dependencies[i]; + + // Load if there's no condition or the condition is truthy + if( !s.condition || s.condition() ) { + if( s.async ) { + scriptsAsync.push( s.src ); + } + else { + scripts.push( s.src ); + } + + // Extension may contain callback functions + if( typeof s.callback === 'function' ) { + head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback ); + } + } + } + + // Called once synchronous scripts finish loading + function proceed() { + if( scriptsAsync.length ) { + // Load asynchronous scripts + head.js.apply( null, scriptsAsync ); + } + + start(); + } + + if( scripts.length ) { + head.ready( proceed ); + + // Load synchronous scripts + head.js.apply( null, scripts ); + } + else { + proceed(); + } + + } + + /** + * Starts up reveal.js by binding input events and navigating + * to the current URL deeplink if there is one. + */ + function start() { + + // Make sure we've got all the DOM elements we need + setupDOM(); + + // Decorate the slide DOM elements with state classes (past/future) + setupSlides(); + + // Updates the presentation to match the current configuration values + configure(); + + // Read the initial hash + readURL(); + + // Notify listeners that the presentation is ready but use a 1ms + // timeout to ensure it's not fired synchronously after #initialize() + setTimeout( function() { + // Enable transitions now that we're loaded + dom.slides.classList.remove( 'no-transition' ); + + loaded = true; + + dispatchEvent( 'ready', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + }, 1 ); + + } + + /** + * Iterates through and decorates slides DOM elements with + * appropriate classes. + */ + function setupSlides() { + + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + horizontalSlides.forEach( function( horizontalSlide ) { + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + verticalSlides.forEach( function( verticalSlide, y ) { + + if( y > 0 ) verticalSlide.classList.add( 'future' ); + + } ); + + } ); + + } + + /** * Finds and stores references to DOM elements which are * required by the presentation. If a required element is * not found, it is created. @@ -192,50 +329,30 @@ var Reveal = (function(){ dom.wrapper = document.querySelector( '.reveal' ); dom.slides = document.querySelector( '.reveal .slides' ); + // Prevent transitions while we're loading + dom.slides.classList.add( 'no-transition' ); + // Background element - if( !document.querySelector( '.reveal .backgrounds' ) ) { - dom.background = document.createElement( 'div' ); - dom.background.classList.add( 'backgrounds' ); - dom.wrapper.appendChild( dom.background ); - } + dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null ); // Progress bar - if( !dom.wrapper.querySelector( '.progress' ) ) { - var progressElement = document.createElement( 'div' ); - progressElement.classList.add( 'progress' ); - progressElement.innerHTML = '<span></span>'; - dom.wrapper.appendChild( progressElement ); - } + dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '<span></span>' ); + dom.progressbar = dom.progress.querySelector( 'span' ); // Arrow controls - if( !dom.wrapper.querySelector( '.controls' ) ) { - var controlsElement = document.createElement( 'aside' ); - controlsElement.classList.add( 'controls' ); - controlsElement.innerHTML = '<div class="navigate-left"></div>' + - '<div class="navigate-right"></div>' + - '<div class="navigate-up"></div>' + - '<div class="navigate-down"></div>'; - dom.wrapper.appendChild( controlsElement ); - } + createSingletonNode( dom.wrapper, 'aside', 'controls', + '<div class="navigate-left"></div>' + + '<div class="navigate-right"></div>' + + '<div class="navigate-up"></div>' + + '<div class="navigate-down"></div>' ); // State background element [DEPRECATED] - if( !dom.wrapper.querySelector( '.state-background' ) ) { - var stateBackgroundElement = document.createElement( 'div' ); - stateBackgroundElement.classList.add( 'state-background' ); - dom.wrapper.appendChild( stateBackgroundElement ); - } + createSingletonNode( dom.wrapper, 'div', 'state-background', null ); // Overlay graphic which is displayed during the paused mode - if( !dom.wrapper.querySelector( '.pause-overlay' ) ) { - var pausedElement = document.createElement( 'div' ); - pausedElement.classList.add( 'pause-overlay' ); - dom.wrapper.appendChild( pausedElement ); - } + createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null ); // Cache references to elements - dom.progress = document.querySelector( '.reveal .progress' ); - dom.progressbar = document.querySelector( '.reveal .progress span' ); - if ( config.controls ) { dom.controls = document.querySelector( '.reveal .controls' ); @@ -251,6 +368,26 @@ var Reveal = (function(){ } /** + * Creates an HTML element and returns a reference to it. + * If the element already exists the existing instance will + * be returned. + */ + function createSingletonNode( container, tagname, classname, innerHTML ) { + + var node = container.querySelector( '.' + classname ); + if( !node ) { + node = document.createElement( tagname ); + node.classList.add( classname ); + if( innerHTML !== null ) { + node.innerHTML = innerHTML; + } + container.appendChild( node ); + } + return node; + + } + + /** * Creates the slide background elements and appends them * to the background container. One element is created per * slide no matter if the given slide has visible background. @@ -335,99 +472,6 @@ var Reveal = (function(){ } /** - * Hides the address bar if we're on a mobile device. - */ - function hideAddressBar() { - - if( /iphone|ipod|android/gi.test( navigator.userAgent ) && !/crios/gi.test( navigator.userAgent ) ) { - // Events that should trigger the address bar to hide - window.addEventListener( 'load', removeAddressBar, false ); - window.addEventListener( 'orientationchange', removeAddressBar, false ); - } - - } - - /** - * Loads the dependencies of reveal.js. Dependencies are - * defined via the configuration option 'dependencies' - * and will be loaded prior to starting/binding reveal.js. - * Some dependencies may have an 'async' flag, if so they - * will load after reveal.js has been started up. - */ - function load() { - - var scripts = [], - scriptsAsync = []; - - for( var i = 0, len = config.dependencies.length; i < len; i++ ) { - var s = config.dependencies[i]; - - // Load if there's no condition or the condition is truthy - if( !s.condition || s.condition() ) { - if( s.async ) { - scriptsAsync.push( s.src ); - } - else { - scripts.push( s.src ); - } - - // Extension may contain callback functions - if( typeof s.callback === 'function' ) { - head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback ); - } - } - } - - // Called once synchronous scripts finish loading - function proceed() { - if( scriptsAsync.length ) { - // Load asynchronous scripts - head.js.apply( null, scriptsAsync ); - } - - start(); - } - - if( scripts.length ) { - head.ready( proceed ); - - // Load synchronous scripts - head.js.apply( null, scripts ); - } - else { - proceed(); - } - - } - - /** - * Starts up reveal.js by binding input events and navigating - * to the current URL deeplink if there is one. - */ - function start() { - - // Make sure we've got all the DOM elements we need - setupDOM(); - - // Updates the presentation to match the current configuration values - configure(); - - // Read the initial hash - readURL(); - - // Notify listeners that the presentation is ready but use a 1ms - // timeout to ensure it's not fired synchronously after #initialize() - setTimeout( function() { - dispatchEvent( 'ready', { - 'indexh': indexh, - 'indexv': indexv, - 'currentSlide': currentSlide - } ); - }, 1 ); - - } - - /** * Applies the configuration settings from the config * object. May be called multiple times. */ @@ -631,6 +675,19 @@ var Reveal = (function(){ } /** + * Applies a CSS transform to the target element. + */ + function transformElement( element, transform ) { + + element.style.WebkitTransform = transform; + element.style.MozTransform = transform; + element.style.msTransform = transform; + element.style.OTransform = transform; + element.style.transform = transform; + + } + + /** * Retrieves the height of the given element by looking * at the position and height of its immediate children. */ @@ -666,6 +723,48 @@ var Reveal = (function(){ } /** + * Returns the remaining height within the parent of the + * target element after subtracting the height of all + * siblings. + * + * remaining height = [parent height] - [ siblings height] + */ + function getRemainingHeight( element, height ) { + + height = height || 0; + + if( element ) { + var parent = element.parentNode; + var siblings = parent.childNodes; + + // Subtract the height of each sibling + toArray( siblings ).forEach( function( sibling ) { + + if( typeof sibling.offsetHeight === 'number' && sibling !== element ) { + + var styles = window.getComputedStyle( sibling ), + marginTop = parseInt( styles.marginTop, 10 ), + marginBottom = parseInt( styles.marginBottom, 10 ); + + height -= sibling.offsetHeight + marginTop + marginBottom; + + } + + } ); + + var elementStyles = window.getComputedStyle( element ); + + // Subtract the margins of the target element + height -= parseInt( elementStyles.marginTop, 10 ) + + parseInt( elementStyles.marginBottom, 10 ); + + } + + return height; + + } + + /** * Checks if this instance is being used to print a PDF. */ function isPrintingPDF() { @@ -675,6 +774,19 @@ var Reveal = (function(){ } /** + * Hides the address bar if we're on a mobile device. + */ + function hideAddressBar() { + + if( /iphone|ipod|android/gi.test( navigator.userAgent ) && !/crios/gi.test( navigator.userAgent ) ) { + // Events that should trigger the address bar to hide + window.addEventListener( 'load', removeAddressBar, false ); + window.addEventListener( 'orientationchange', removeAddressBar, false ); + } + + } + + /** * Causes the address bar to hide on mobile devices, * more vertical space ftw. */ @@ -886,7 +998,11 @@ var Reveal = (function(){ // Dimensions of the content var slideWidth = config.width, - slideHeight = config.height; + slideHeight = config.height, + slidePadding = 20; // TODO Dig this out of DOM + + // Layout the contents of the slides + layoutSlideContents( config.width, config.height, slidePadding ); // Slide width may be a percentage of available width if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) { @@ -915,13 +1031,7 @@ var Reveal = (function(){ } // Apply scale transform as a fallback else { - var transform = 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)'; - - dom.slides.style.WebkitTransform = transform; - dom.slides.style.MozTransform = transform; - dom.slides.style.msTransform = transform; - dom.slides.style.OTransform = transform; - dom.slides.style.transform = transform; + transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)' ); } // Select all slides, vertical and horizontal @@ -942,7 +1052,7 @@ var Reveal = (function(){ slide.style.top = 0; } else { - slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - 20, -slideHeight / 2 ) + 'px'; + slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - slidePadding, -slideHeight / 2 ) + 'px'; } } else { @@ -958,6 +1068,38 @@ var Reveal = (function(){ } /** + * Applies layout logic to the contents of all slides in + * the presentation. + */ + function layoutSlideContents( width, height, padding ) { + + // Handle sizing of elements with the 'stretch' class + toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { + + // Determine how much vertical space we can use + var remainingHeight = getRemainingHeight( element, ( height - ( padding * 2 ) ) ); + + // Consider the aspect ratio of media elements + if( /(img|video)/gi.test( element.nodeName ) ) { + var nw = element.naturalWidth || element.videoWidth, + nh = element.naturalHeight || element.videoHeight; + + var es = Math.min( width / nw, remainingHeight / nh ); + + element.style.width = ( nw * es ) + 'px'; + element.style.height = ( nh * es ) + 'px'; + + } + else { + element.style.width = width + 'px'; + element.style.height = remainingHeight + 'px'; + } + + } ); + + } + + /** * Stores the vertical index of a stack so that the same * vertical slide can be selected when navigating to and * from the stack. @@ -1010,6 +1152,9 @@ var Reveal = (function(){ var wasActive = dom.wrapper.classList.contains( 'overview' ); + // Vary the depth of the overview based on screen size + var depth = window.innerWidth < 400 ? 1000 : 2500; + dom.wrapper.classList.add( 'overview' ); dom.wrapper.classList.remove( 'exit-overview' ); @@ -1025,16 +1170,12 @@ var Reveal = (function(){ for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { var hslide = horizontalSlides[i], - hoffset = config.rtl ? -105 : 105, - htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)'; + hoffset = config.rtl ? -105 : 105; hslide.setAttribute( 'data-index-h', i ); - hslide.style.display = 'block'; - hslide.style.WebkitTransform = htransform; - hslide.style.MozTransform = htransform; - hslide.style.msTransform = htransform; - hslide.style.OTransform = htransform; - hslide.style.transform = htransform; + + // Apply CSS transform + transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' ); if( hslide.classList.contains( 'stack' ) ) { @@ -1043,17 +1184,13 @@ var Reveal = (function(){ for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide ); - var vslide = verticalSlides[j], - vtransform = 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)'; + var vslide = verticalSlides[j]; vslide.setAttribute( 'data-index-h', i ); vslide.setAttribute( 'data-index-v', j ); - vslide.style.display = 'block'; - vslide.style.WebkitTransform = vtransform; - vslide.style.MozTransform = vtransform; - vslide.style.msTransform = vtransform; - vslide.style.OTransform = vtransform; - vslide.style.transform = vtransform; + + // Apply CSS transform + transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' ); // Navigate to this slide on click vslide.addEventListener( 'click', onOverviewSlideClicked, true ); @@ -1068,6 +1205,8 @@ var Reveal = (function(){ } } + updateSlidesVisibility(); + layout(); if( !wasActive ) { @@ -1117,11 +1256,7 @@ var Reveal = (function(){ element.style.display = ''; // Resets all transforms to use the external styles - element.style.WebkitTransform = ''; - element.style.MozTransform = ''; - element.style.msTransform = ''; - element.style.OTransform = ''; - element.style.transform = ''; + transformElement( element, '' ); element.removeEventListener( 'click', onOverviewSlideClicked, true ); } @@ -1302,13 +1437,16 @@ var Reveal = (function(){ // Reset the state array state.length = 0; - var indexhBefore = indexh, - indexvBefore = indexv; + var indexhBefore = indexh || 0, + indexvBefore = indexv || 0; // Activate and transition to the new slide indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); + // Update the visibility of slides now that the indices have changed + updateSlidesVisibility(); + layout(); // Apply the new state @@ -1338,10 +1476,6 @@ var Reveal = (function(){ activateOverview(); } - // Update the URL hash after a delay since updating it mid-transition - // is likely to cause visual lag - writeURL( 1500 ); - // Find the current horizontal slide and any possible vertical slides // within it var currentHorizontalSlide = horizontalSlides[ indexh ], @@ -1413,6 +1547,9 @@ var Reveal = (function(){ updateProgress(); updateBackground(); + // Update the URL hash + writeURL(); + } /** @@ -1481,16 +1618,6 @@ var Reveal = (function(){ for( var i = 0; i < slidesLength; i++ ) { var element = slides[i]; - // Optimization; hide all slides that are three or more steps - // away from the present slide - if( isOverview() === false ) { - // The distance loops so that it measures 1 between the first - // and last slides - var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0; - - element.style.display = distance > 3 ? 'none' : 'block'; - } - var reverse = config.rtl && !isVerticalSlide( element ); element.classList.remove( 'past' ); @@ -1507,6 +1634,13 @@ var Reveal = (function(){ else if( i > index ) { // Any element subsequent to index is given the 'future' class element.classList.add( reverse ? 'past' : 'future' ); + + var fragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); + + // No fragments in future slides should be visible ahead of time + while( fragments.length ) { + fragments.pop().classList.remove( 'visible' ); + } } // If this element contains vertical slides @@ -1526,7 +1660,7 @@ var Reveal = (function(){ state = state.concat( slideState.split( ' ' ) ); } - // If this slide has a data-autoslide attribtue associated use this as + // If this slide has a data-autoslide attribute associated use this as // autoSlide value otherwise use the global configured time var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' ); if( slideAutoSlide ) { @@ -1536,6 +1670,8 @@ var Reveal = (function(){ autoSlide = config.autoSlide; } + cueAutoSlide(); + } else { // Since there are no slides we can't be anywhere beyond the @@ -1548,6 +1684,61 @@ var Reveal = (function(){ } /** + * Optimization method; hide all slides that are far away + * from the present slide. + */ + function updateSlidesVisibility() { + + // Select all slides and convert the NodeList result to + // an array + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ), + horizontalSlidesLength = horizontalSlides.length, + distanceX, + distanceY; + + if( horizontalSlidesLength ) { + + // The number of steps away from the present slide that will + // be visible + var viewDistance = isOverview() ? 10 : config.viewDistance; + + // Limit view distance on weaker devices + if( isMobileDevice ) { + viewDistance = isOverview() ? 6 : 1; + } + + for( var x = 0; x < horizontalSlidesLength; x++ ) { + var horizontalSlide = horizontalSlides[x]; + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ), + verticalSlidesLength = verticalSlides.length; + + // Loops so that it measures 1 between the first and last slides + distanceX = Math.abs( ( indexh - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0; + + // Show the horizontal slide if it's within the view distance + horizontalSlide.style.display = distanceX > viewDistance ? 'none' : 'block'; + + if( verticalSlidesLength ) { + + var oy = getPreviousVerticalIndex( horizontalSlide ); + + for( var y = 0; y < verticalSlidesLength; y++ ) { + var verticalSlide = verticalSlides[y]; + + distanceY = x === indexh ? Math.abs( indexv - y ) : Math.abs( y - oy ); + + verticalSlide.style.display = ( distanceX + distanceY ) > viewDistance ? 'none' : 'block'; + } + + } + } + + } + + } + + /** * Updates the progress bar to reflect the current slide. */ function updateProgress() { @@ -1803,7 +1994,7 @@ var Reveal = (function(){ } // If the slide doesn't exist, navigate to the current slide else { - slide( indexh, indexv ); + slide( indexh || 0, indexv || 0 ); } } else { @@ -1811,7 +2002,9 @@ var Reveal = (function(){ var h = parseInt( bits[0], 10 ) || 0, v = parseInt( bits[1], 10 ) || 0; - slide( h, v ); + if( h !== indexh || v !== indexv ) { + slide( h, v ); + } } } @@ -1888,8 +2081,9 @@ var Reveal = (function(){ } if( !slide && currentSlide ) { - var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); - if( visibleFragments.length ) { + var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0; + if( hasFragments ) { + var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); f = visibleFragments.length; } } @@ -1918,11 +2112,11 @@ var Reveal = (function(){ toArray( fragments ).forEach( function( element ) { element.classList.add( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmentshown', { fragment: element } ); } ); + // Notify subscribers of the change + dispatchEvent( 'fragmentshown', { fragment: fragments[0], fragments: fragments } ); + updateControls(); return true; } @@ -1952,11 +2146,11 @@ var Reveal = (function(){ toArray( fragments ).forEach( function( f ) { f.classList.remove( 'visible' ); - - // Notify subscribers of the change - dispatchEvent( 'fragmenthidden', { fragment: f } ); } ); + // Notify subscribers of the change + dispatchEvent( 'fragmenthidden', { fragment: fragments[0], fragments: fragments } ); + updateControls(); return true; } @@ -2119,7 +2313,7 @@ var Reveal = (function(){ var value = config.keyboard[ key ]; - // Calback function + // Callback function if( typeof value === 'function' ) { value.apply( null, [ event ] ); } @@ -2178,7 +2372,8 @@ var Reveal = (function(){ if( triggered ) { event.preventDefault(); } - else if ( event.keyCode === 27 && supports3DTransforms ) { + // ESC or O key + else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && supports3DTransforms ) { toggleOverview(); event.preventDefault(); @@ -2220,11 +2415,11 @@ var Reveal = (function(){ function onTouchMove( event ) { // Each touch should only trigger one action - if( !touch.handled ) { + if( !touch.captured ) { var currentX = event.touches[0].clientX; var currentY = event.touches[0].clientY; - // If the touch started off with two points and still has + // If the touch started with two points and still has // two active touches; test for the pinch gesture if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) { @@ -2240,7 +2435,7 @@ var Reveal = (function(){ // If the span is larger than the desire amount we've got // ourselves a pinch if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) { - touch.handled = true; + touch.captured = true; if( currentSpan < touch.startSpan ) { activateOverview(); @@ -2260,23 +2455,34 @@ var Reveal = (function(){ deltaY = currentY - touch.startY; if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { - touch.handled = true; + touch.captured = true; navigateLeft(); } else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { - touch.handled = true; + touch.captured = true; navigateRight(); } else if( deltaY > touch.threshold ) { - touch.handled = true; + touch.captured = true; navigateUp(); } else if( deltaY < -touch.threshold ) { - touch.handled = true; + touch.captured = true; navigateDown(); } - event.preventDefault(); + // If we're embedded, only block touch events if they have + // triggered an action + if( config.embedded ) { + if( touch.captured || isVerticalSlide( currentSlide ) ) { + event.preventDefault(); + } + } + // Not embedded? Block them all to avoid needless tossing + // around of the viewport in iOS + else { + event.preventDefault(); + } } } @@ -2293,7 +2499,7 @@ var Reveal = (function(){ */ function onTouchEnd( event ) { - touch.handled = false; + touch.captured = false; } @@ -2561,6 +2767,11 @@ var Reveal = (function(){ } }, + // Checks if reveal.js has been loaded and is ready for use + isReady: function() { + return loaded; + }, + // Forward event binding to the reveal DOM element addEventListener: function( type, listener, useCapture ) { if( 'addEventListener' in window ) { diff --git a/js/reveal.min.js b/js/reveal.min.js index e9d124f..a9d61e8 100644 --- a/js/reveal.min.js +++ b/js/reveal.min.js @@ -1,8 +1,8 @@ /*! - * reveal.js 2.5.0 (2013-06-22, 19:21) + * reveal.js 2.5.0 (2013-08-19, 23:45) * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2013 Hakim El Hattab, http://hakim.se */ -var Reveal=function(){"use strict";function e(e){return zt||Yt?(window.addEventListener("load",k,!1),l(Pt,e),r(),o(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function t(){if(Ot.theme=document.querySelector("#theme"),Ot.wrapper=document.querySelector(".reveal"),Ot.slides=document.querySelector(".reveal .slides"),document.querySelector(".reveal .backgrounds")||(Ot.background=document.createElement("div"),Ot.background.classList.add("backgrounds"),Ot.wrapper.appendChild(Ot.background)),!Ot.wrapper.querySelector(".progress")){var e=document.createElement("div");e.classList.add("progress"),e.innerHTML="<span></span>",Ot.wrapper.appendChild(e)}if(!Ot.wrapper.querySelector(".controls")){var t=document.createElement("aside");t.classList.add("controls"),t.innerHTML='<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>',Ot.wrapper.appendChild(t)}if(!Ot.wrapper.querySelector(".state-background")){var n=document.createElement("div");n.classList.add("state-background"),Ot.wrapper.appendChild(n)}if(!Ot.wrapper.querySelector(".pause-overlay")){var r=document.createElement("div");r.classList.add("pause-overlay"),Ot.wrapper.appendChild(r)}Ot.progress=document.querySelector(".reveal .progress"),Ot.progressbar=document.querySelector(".reveal .progress span"),Pt.controls&&(Ot.controls=document.querySelector(".reveal .controls"),Ot.controlsLeft=d(document.querySelectorAll(".navigate-left")),Ot.controlsRight=d(document.querySelectorAll(".navigate-right")),Ot.controlsUp=d(document.querySelectorAll(".navigate-up")),Ot.controlsDown=d(document.querySelectorAll(".navigate-down")),Ot.controlsPrev=d(document.querySelectorAll(".navigate-prev")),Ot.controlsNext=d(document.querySelectorAll(".navigate-next")))}function n(){function e(e,t){var n={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition")},r=document.createElement("div");return r.className="slide-background",n.background&&(/^(http|file|\/\/)/gi.test(n.background)||/\.(png|jpg|jpeg|gif|bmp)$/gi.test(n.background)?r.style.backgroundImage="url("+n.background+")":r.style.background=n.background),n.backgroundSize&&(r.style.backgroundSize=n.backgroundSize),n.backgroundImage&&(r.style.backgroundImage='url("'+n.backgroundImage+'")'),n.backgroundColor&&(r.style.backgroundColor=n.backgroundColor),n.backgroundRepeat&&(r.style.backgroundRepeat=n.backgroundRepeat),n.backgroundPosition&&(r.style.backgroundPosition=n.backgroundPosition),n.backgroundTransition&&r.setAttribute("data-background-transition",n.backgroundTransition),t.appendChild(r),r}v()&&document.body.classList.add("print-pdf"),Ot.background.innerHTML="",Ot.background.classList.add("no-transition"),d(document.querySelectorAll(xt)).forEach(function(t){var n;n=v()?e(t,t):e(t,Ot.background),d(t.querySelectorAll("section")).forEach(function(t){v()?e(t,t):e(t,n)})})}function r(){/iphone|ipod|android/gi.test(navigator.userAgent)&&!/crios/gi.test(navigator.userAgent)&&(window.addEventListener("load",p,!1),window.addEventListener("orientationchange",p,!1))}function o(){function e(){n.length&&head.js.apply(null,n),a()}for(var t=[],n=[],r=0,o=Pt.dependencies.length;o>r;r++){var i=Pt.dependencies[r];(!i.condition||i.condition())&&(i.async?n.push(i.src):t.push(i.src),"function"==typeof i.callback&&head.ready(i.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],i.callback))}t.length?(head.ready(e),head.js.apply(null,t)):e()}function a(){t(),i(),K(),setTimeout(function(){m("ready",{indexh:Dt,indexv:Ct,currentSlide:At})},1)}function i(e){if(Ot.wrapper.classList.remove(Pt.transition),"object"==typeof e&&l(Pt,e),Yt===!1&&(Pt.transition="linear"),Ot.wrapper.classList.add(Pt.transition),Ot.wrapper.setAttribute("data-transition-speed",Pt.transitionSpeed),Ot.wrapper.setAttribute("data-background-transition",Pt.backgroundTransition),Ot.controls&&(Ot.controls.style.display=Pt.controls&&Ot.controls?"block":"none"),Ot.progress&&(Ot.progress.style.display=Pt.progress&&Ot.progress?"block":"none"),Pt.rtl?Ot.wrapper.classList.add("rtl"):Ot.wrapper.classList.remove("rtl"),Pt.center?Ot.wrapper.classList.add("center"):Ot.wrapper.classList.remove("center"),Pt.mouseWheel?(document.addEventListener("DOMMouseScroll",ft,!1),document.addEventListener("mousewheel",ft,!1)):(document.removeEventListener("DOMMouseScroll",ft,!1),document.removeEventListener("mousewheel",ft,!1)),Pt.rollingLinks?g():h(),Pt.previewLinks?y():(b(),y("[data-preview-link]")),Pt.theme&&Ot.theme){var t=Ot.theme.getAttribute("href"),n=/[^\/]*?(?=\.css)/,r=t.match(n)[0];Pt.theme!==r&&(t=t.replace(n,Pt.theme),Ot.theme.setAttribute("href",t))}Y()}function s(){Ft=!0,window.addEventListener("hashchange",wt,!1),window.addEventListener("resize",Lt,!1),Pt.touch&&(Ot.wrapper.addEventListener("touchstart",it,!1),Ot.wrapper.addEventListener("touchmove",st,!1),Ot.wrapper.addEventListener("touchend",ct,!1),window.navigator.msPointerEnabled&&(Ot.wrapper.addEventListener("MSPointerDown",lt,!1),Ot.wrapper.addEventListener("MSPointerMove",dt,!1),Ot.wrapper.addEventListener("MSPointerUp",ut,!1))),Pt.keyboard&&document.addEventListener("keydown",at,!1),Pt.progress&&Ot.progress&&Ot.progress.addEventListener("click",vt,!1),Pt.controls&&Ot.controls&&["touchstart","click"].forEach(function(e){Ot.controlsLeft.forEach(function(t){t.addEventListener(e,pt,!1)}),Ot.controlsRight.forEach(function(t){t.addEventListener(e,mt,!1)}),Ot.controlsUp.forEach(function(t){t.addEventListener(e,gt,!1)}),Ot.controlsDown.forEach(function(t){t.addEventListener(e,ht,!1)}),Ot.controlsPrev.forEach(function(t){t.addEventListener(e,yt,!1)}),Ot.controlsNext.forEach(function(t){t.addEventListener(e,bt,!1)})})}function c(){Ft=!1,document.removeEventListener("keydown",at,!1),window.removeEventListener("hashchange",wt,!1),window.removeEventListener("resize",Lt,!1),Ot.wrapper.removeEventListener("touchstart",it,!1),Ot.wrapper.removeEventListener("touchmove",st,!1),Ot.wrapper.removeEventListener("touchend",ct,!1),window.navigator.msPointerEnabled&&(Ot.wrapper.removeEventListener("MSPointerDown",lt,!1),Ot.wrapper.removeEventListener("MSPointerMove",dt,!1),Ot.wrapper.removeEventListener("MSPointerUp",ut,!1)),Pt.progress&&Ot.progress&&Ot.progress.removeEventListener("click",vt,!1),Pt.controls&&Ot.controls&&["touchstart","click"].forEach(function(e){Ot.controlsLeft.forEach(function(t){t.removeEventListener(e,pt,!1)}),Ot.controlsRight.forEach(function(t){t.removeEventListener(e,mt,!1)}),Ot.controlsUp.forEach(function(t){t.removeEventListener(e,gt,!1)}),Ot.controlsDown.forEach(function(t){t.removeEventListener(e,ht,!1)}),Ot.controlsPrev.forEach(function(t){t.removeEventListener(e,yt,!1)}),Ot.controlsNext.forEach(function(t){t.removeEventListener(e,bt,!1)})})}function l(e,t){for(var n in t)e[n]=t[n]}function d(e){return Array.prototype.slice.call(e)}function u(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function f(e){var t=0;if(e){var n=0;d(e.childNodes).forEach(function(e){"number"==typeof e.offsetTop&&e.style&&("absolute"===e.style.position&&(n+=1),t=Math.max(t,e.offsetTop+e.offsetHeight))}),0===n&&(t=e.offsetHeight)}return t}function v(){return/print-pdf/gi.test(window.location.search)}function p(){0===window.orientation?(document.documentElement.style.overflow="scroll",document.body.style.height="120%"):(document.documentElement.style.overflow="",document.body.style.height="100%"),setTimeout(function(){window.scrollTo(0,1)},10)}function m(e,t){var n=document.createEvent("HTMLEvents",1,2);n.initEvent(e,!0,!0),l(n,t),Ot.wrapper.dispatchEvent(n)}function g(){if(Yt&&!("msPerspective"in document.body.style))for(var e=document.querySelectorAll(qt+" a:not(.image)"),t=0,n=e.length;n>t;t++){var r=e[t];if(!(!r.textContent||r.querySelector("*")||r.className&&r.classList.contains(r,"roll"))){var o=document.createElement("span");o.setAttribute("data-title",r.text),o.innerHTML=r.innerHTML,r.classList.add("roll"),r.innerHTML="",r.appendChild(o)}}}function h(){for(var e=document.querySelectorAll(qt+" a.roll"),t=0,n=e.length;n>t;t++){var r=e[t],o=r.querySelector("span");o&&(r.classList.remove("roll"),r.innerHTML=o.innerHTML)}}function y(e){var t=d(document.querySelectorAll(e?e:"a"));t.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",kt,!1)})}function b(){var e=d(document.querySelectorAll("a"));e.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",kt,!1)})}function w(e){L(),Ot.preview=document.createElement("div"),Ot.preview.classList.add("preview-link-overlay"),Ot.wrapper.appendChild(Ot.preview),Ot.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+e+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+e+'"></iframe>',"</div>"].join(""),Ot.preview.querySelector("iframe").addEventListener("load",function(){Ot.preview.classList.add("loaded")},!1),Ot.preview.querySelector(".close").addEventListener("click",function(e){L(),e.preventDefault()},!1),Ot.preview.querySelector(".external").addEventListener("click",function(){L()},!1),setTimeout(function(){Ot.preview.classList.add("visible")},1)}function L(){Ot.preview&&(Ot.preview.setAttribute("src",""),Ot.preview.parentNode.removeChild(Ot.preview),Ot.preview=null)}function E(e){var t=d(e);return t.forEach(function(e,t){e.hasAttribute("data-fragment-index")||e.setAttribute("data-fragment-index",t)}),t.sort(function(e,t){return e.getAttribute("data-fragment-index")-t.getAttribute("data-fragment-index")}),t}function k(){if(Ot.wrapper&&!v()){var e=Ot.wrapper.offsetWidth,t=Ot.wrapper.offsetHeight;e-=t*Pt.margin,t-=t*Pt.margin;var n=Pt.width,r=Pt.height;if("string"==typeof n&&/%$/.test(n)&&(n=parseInt(n,10)/100*e),"string"==typeof r&&/%$/.test(r)&&(r=parseInt(r,10)/100*t),Ot.slides.style.width=n+"px",Ot.slides.style.height=r+"px",It=Math.min(e/n,t/r),It=Math.max(It,Pt.minScale),It=Math.min(It,Pt.maxScale),void 0===Ot.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)){var o="translate(-50%, -50%) scale("+It+") translate(50%, 50%)";Ot.slides.style.WebkitTransform=o,Ot.slides.style.MozTransform=o,Ot.slides.style.msTransform=o,Ot.slides.style.OTransform=o,Ot.slides.style.transform=o}else Ot.slides.style.zoom=It;for(var a=d(document.querySelectorAll(qt)),i=0,s=a.length;s>i;i++){var c=a[i];"none"!==c.style.display&&(c.style.top=Pt.center?c.classList.contains("stack")?0:Math.max(-(f(c)/2)-20,-r/2)+"px":"")}H()}}function S(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function A(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){var t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function q(){if(Pt.overview){G();var e=Ot.wrapper.classList.contains("overview");Ot.wrapper.classList.add("overview"),Ot.wrapper.classList.remove("exit-overview"),clearTimeout(Ut),clearTimeout(jt),Ut=setTimeout(function(){for(var t=document.querySelectorAll(xt),n=0,r=t.length;r>n;n++){var o=t[n],a=Pt.rtl?-105:105,i="translateZ(-2500px) translate("+(n-Dt)*a+"%, 0%)";if(o.setAttribute("data-index-h",n),o.style.display="block",o.style.WebkitTransform=i,o.style.MozTransform=i,o.style.msTransform=i,o.style.OTransform=i,o.style.transform=i,o.classList.contains("stack"))for(var s=o.querySelectorAll("section"),c=0,l=s.length;l>c;c++){var d=n===Dt?Ct:A(o),u=s[c],f="translate(0%, "+105*(c-d)+"%)";u.setAttribute("data-index-h",n),u.setAttribute("data-index-v",c),u.style.display="block",u.style.WebkitTransform=f,u.style.MozTransform=f,u.style.msTransform=f,u.style.OTransform=f,u.style.transform=f,u.addEventListener("click",Et,!0)}else o.addEventListener("click",Et,!0)}k(),e||m("overviewshown",{indexh:Dt,indexv:Ct,currentSlide:At})},10)}}function x(){if(Pt.overview){clearTimeout(Ut),clearTimeout(jt),Ot.wrapper.classList.remove("overview"),Ot.wrapper.classList.add("exit-overview"),jt=setTimeout(function(){Ot.wrapper.classList.remove("exit-overview")},10);for(var e=d(document.querySelectorAll(qt)),t=0,n=e.length;n>t;t++){var r=e[t];r.style.display="",r.style.WebkitTransform="",r.style.MozTransform="",r.style.msTransform="",r.style.OTransform="",r.style.transform="",r.removeEventListener("click",Et,!0)}O(Dt,Ct),B(),m("overviewhidden",{indexh:Dt,indexv:Ct,currentSlide:At})}}function T(e){"boolean"==typeof e?e?q():x():M()?x():q()}function M(){return Ot.wrapper.classList.contains("overview")}function P(e){return e=e?e:At,e&&!!e.parentNode.nodeName.match(/section/i)}function N(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&t.apply(e)}function D(){var e=Ot.wrapper.classList.contains("paused");G(),Ot.wrapper.classList.add("paused"),e===!1&&m("paused")}function C(){var e=Ot.wrapper.classList.contains("paused");Ot.wrapper.classList.remove("paused"),B(),e&&m("resumed")}function R(){I()?C():D()}function I(){return Ot.wrapper.classList.contains("paused")}function O(e,t,n,r){St=At;var o=document.querySelectorAll(xt);void 0===t&&(t=A(o[e])),St&&St.parentNode&&St.parentNode.classList.contains("stack")&&S(St.parentNode,Ct);var a=Rt.concat();Rt.length=0;var i=Dt,s=Ct;Dt=z(xt,void 0===e?Dt:e),Ct=z(Tt,void 0===t?Ct:t),k();e:for(var c=0,l=Rt.length;l>c;c++){for(var u=0;a.length>u;u++)if(a[u]===Rt[c]){a.splice(u,1);continue e}document.documentElement.classList.add(Rt[c]),m(Rt[c])}for(;a.length;)document.documentElement.classList.remove(a.pop());M()&&q(),$(1500);var f=o[Dt],v=f.querySelectorAll("section");if(At=v[Ct]||f,n!==void 0){var p=E(At.querySelectorAll(".fragment"));d(p).forEach(function(e,t){n>t?e.classList.add("visible"):e.classList.remove("visible")})}var g=Dt!==i||Ct!==s;g?m("slidechanged",{indexh:Dt,indexv:Ct,previousSlide:St,currentSlide:At,origin:r}):St=null,St&&(St.classList.remove("present"),document.querySelector(Mt).classList.contains("present")&&setTimeout(function(){var e,t=d(document.querySelectorAll(xt+".stack"));for(e in t)t[e]&&S(t[e],0)},0)),g&&(_(St),F(At)),X(),H(),W()}function Y(){c(),s(),k(),Nt=Pt.autoSlide,B(),n(),X(),H(),W()}function z(e,t){var n=d(document.querySelectorAll(e)),r=n.length;if(r){Pt.loop&&(t%=r,0>t&&(t=r+t)),t=Math.max(Math.min(t,r-1),0);for(var o=0;r>o;o++){var a=n[o];if(M()===!1){var i=Math.abs((t-o)%(r-3))||0;a.style.display=i>3?"none":"block"}var s=Pt.rtl&&!P(a);a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),a.setAttribute("hidden",""),t>o?a.classList.add(s?"future":"past"):o>t&&a.classList.add(s?"past":"future"),a.querySelector("section")&&a.classList.add("stack")}n[t].classList.add("present"),n[t].removeAttribute("hidden");var c=n[t].getAttribute("data-state");c&&(Rt=Rt.concat(c.split(" ")));var l=n[t].getAttribute("data-autoslide");Nt=l?parseInt(l,10):Pt.autoSlide}else t=0;return t}function H(){if(Pt.progress&&Ot.progress){var e=d(document.querySelectorAll(xt)),t=document.querySelectorAll(qt+":not(.stack)").length,n=0;e:for(var r=0;e.length>r;r++){for(var o=e[r],a=d(o.querySelectorAll("section")),i=0;a.length>i;i++){if(a[i].classList.contains("present"))break e;n++}if(o.classList.contains("present"))break;o.classList.contains("stack")===!1&&n++}Ot.progressbar.style.width=n/(t-1)*window.innerWidth+"px"}}function X(){if(Pt.controls&&Ot.controls){var e=U(),t=j();Ot.controlsLeft.concat(Ot.controlsRight).concat(Ot.controlsUp).concat(Ot.controlsDown).concat(Ot.controlsPrev).concat(Ot.controlsNext).forEach(function(e){e.classList.remove("enabled"),e.classList.remove("fragmented")}),e.left&&Ot.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&Ot.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&Ot.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&Ot.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&Ot.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&Ot.controlsNext.forEach(function(e){e.classList.add("enabled")}),At&&(t.prev&&Ot.controlsPrev.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsNext.forEach(function(e){e.classList.add("fragmented","enabled")}),P(At)?(t.prev&&Ot.controlsUp.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsDown.forEach(function(e){e.classList.add("fragmented","enabled")})):(t.prev&&Ot.controlsLeft.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&Ot.controlsRight.forEach(function(e){e.classList.add("fragmented","enabled")})))}}function W(){d(Ot.background.childNodes).forEach(function(e,t){var n=Pt.rtl?"future":"past",r=Pt.rtl?"past":"future";e.className="slide-background "+(Dt>t?n:t>Dt?r:"present"),d(e.childNodes).forEach(function(e,t){e.className="slide-background "+(Ct>t?"past":t>Ct?"future":"present")})}),setTimeout(function(){Ot.background.classList.remove("no-transition")},1)}function U(){var e=document.querySelectorAll(xt),t=document.querySelectorAll(Tt),n={left:Dt>0||Pt.loop,right:e.length-1>Dt||Pt.loop,up:Ct>0,down:t.length-1>Ct};if(Pt.rtl){var r=n.left;n.left=n.right,n.right=r}return n}function j(){if(At&&Pt.fragments){var e=At.querySelectorAll(".fragment"),t=At.querySelectorAll(".fragment:not(.visible)");return{prev:e.length-t.length>0,next:!!t.length}}return{prev:!1,next:!1}}function F(e){e&&(d(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&e.play()}),d(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-autoplay")&&e.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function _(e){e&&(d(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-ignore")||e.pause()}),d(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function K(){var e=window.location.hash,t=e.slice(2).split("/"),n=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&n.length){var r=document.querySelector("#"+n);if(r){var o=Reveal.getIndices(r);O(o.h,o.v)}else O(Dt,Ct)}else{var a=parseInt(t[0],10)||0,i=parseInt(t[1],10)||0;O(a,i)}}function $(e){if(Pt.history)if(clearTimeout(Wt),"number"==typeof e)Wt=setTimeout($,e);else{var t="/";At&&"string"==typeof At.getAttribute("id")?t="/"+At.getAttribute("id"):((Dt>0||Ct>0)&&(t+=Dt),Ct>0&&(t+="/"+Ct)),window.location.hash=t}}function V(e){var t,n=Dt,r=Ct;if(e){var o=P(e),a=o?e.parentNode:e,i=d(document.querySelectorAll(xt));n=Math.max(i.indexOf(a),0),o&&(r=Math.max(d(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&At){var s=At.querySelectorAll(".fragment.visible");s.length&&(t=s.length)}return{h:n,v:r,f:t}}function Z(){if(At&&Pt.fragments){var e=E(At.querySelectorAll(".fragment:not(.visible)"));if(e.length){var t=e[0].getAttribute("data-fragment-index");return e=At.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),d(e).forEach(function(e){e.classList.add("visible"),m("fragmentshown",{fragment:e})}),X(),!0}}return!1}function Q(){if(At&&Pt.fragments){var e=E(At.querySelectorAll(".fragment.visible"));if(e.length){var t=e[e.length-1].getAttribute("data-fragment-index");return e=At.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),d(e).forEach(function(e){e.classList.remove("visible"),m("fragmenthidden",{fragment:e})}),X(),!0}}return!1}function B(){clearTimeout(Xt),!Nt||I()||M()||(Xt=setTimeout(ot,Nt))}function G(){clearTimeout(Xt)}function J(){Pt.rtl?(M()||Z()===!1)&&U().left&&O(Dt+1):(M()||Q()===!1)&&U().left&&O(Dt-1)}function et(){Pt.rtl?(M()||Q()===!1)&&U().right&&O(Dt-1):(M()||Z()===!1)&&U().right&&O(Dt+1)}function tt(){(M()||Q()===!1)&&U().up&&O(Dt,Ct-1)}function nt(){(M()||Z()===!1)&&U().down&&O(Dt,Ct+1)}function rt(){if(Q()===!1)if(U().up)tt();else{var e=document.querySelector(xt+".past:nth-child("+Dt+")");if(e){var t=e.querySelectorAll("section").length-1||void 0,n=Dt-1;O(n,t)}}}function ot(){Z()===!1&&(U().down?nt():et()),B()}function at(e){document.activeElement;var t=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(t||e.shiftKey&&32!==e.keyCode||e.altKey||e.ctrlKey||e.metaKey)){if(I()&&-1===[66,190,191].indexOf(e.keyCode))return!1;var n=!1;if("object"==typeof Pt.keyboard)for(var r in Pt.keyboard)if(parseInt(r,10)===e.keyCode){var o=Pt.keyboard[r];"function"==typeof o?o.apply(null,[e]):"string"==typeof o&&"function"==typeof Reveal[o]&&Reveal[o].call(),n=!0}if(n===!1)switch(n=!0,e.keyCode){case 80:case 33:rt();break;case 78:case 34:ot();break;case 72:case 37:J();break;case 76:case 39:et();break;case 75:case 38:tt();break;case 74:case 40:nt();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:M()?x():e.shiftKey?rt():ot();break;case 13:M()?x():n=!1;break;case 66:case 190:case 191:R();break;case 70:N();break;default:n=!1}n?e.preventDefault():27===e.keyCode&&Yt&&(T(),e.preventDefault()),B()}}function it(e){_t.startX=e.touches[0].clientX,_t.startY=e.touches[0].clientY,_t.startCount=e.touches.length,2===e.touches.length&&Pt.overview&&(_t.startSpan=u({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:_t.startX,y:_t.startY}))}function st(e){if(_t.handled)navigator.userAgent.match(/android/gi)&&e.preventDefault();else{var t=e.touches[0].clientX,n=e.touches[0].clientY;if(2===e.touches.length&&2===_t.startCount&&Pt.overview){var r=u({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:_t.startX,y:_t.startY});Math.abs(_t.startSpan-r)>_t.threshold&&(_t.handled=!0,_t.startSpan>r?q():x()),e.preventDefault()}else if(1===e.touches.length&&2!==_t.startCount){var o=t-_t.startX,a=n-_t.startY;o>_t.threshold&&Math.abs(o)>Math.abs(a)?(_t.handled=!0,J()):-_t.threshold>o&&Math.abs(o)>Math.abs(a)?(_t.handled=!0,et()):a>_t.threshold?(_t.handled=!0,tt()):-_t.threshold>a&&(_t.handled=!0,nt()),e.preventDefault()}}}function ct(){_t.handled=!1}function lt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],it(e))}function dt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],st(e))}function ut(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],ct(e))}function ft(e){if(Date.now()-Ht>600){Ht=Date.now();var t=e.detail||-e.wheelDelta;t>0?ot():rt()}}function vt(e){e.preventDefault();var t=d(document.querySelectorAll(xt)).length,n=Math.floor(e.clientX/Ot.wrapper.offsetWidth*t);O(n)}function pt(e){e.preventDefault(),J()}function mt(e){e.preventDefault(),et()}function gt(e){e.preventDefault(),tt()}function ht(e){e.preventDefault(),nt()}function yt(e){e.preventDefault(),rt()}function bt(e){e.preventDefault(),ot()}function wt(){K()}function Lt(){k()}function Et(e){if(Ft&&M()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(x(),t.nodeName.match(/section/gi))){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);O(n,r)}}}function kt(e){var t=e.target.getAttribute("href");t&&(w(t),e.preventDefault())}var St,At,qt=".reveal .slides section",xt=".reveal .slides>section",Tt=".reveal .slides>section.present>section",Mt=".reveal .slides>section:first-child",Pt={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,autoSlide:0,mouseWheel:!1,rollingLinks:!0,previewLinks:!1,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",dependencies:[]},Nt=0,Dt=0,Ct=0,Rt=[],It=1,Ot={},Yt="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,zt="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,Ht=0,Xt=0,Wt=0,Ut=0,jt=0,Ft=!1,_t={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:e,configure:i,sync:Y,slide:O,left:J,right:et,up:tt,down:nt,prev:rt,next:ot,prevFragment:Q,nextFragment:Z,navigateTo:O,navigateLeft:J,navigateRight:et,navigateUp:tt,navigateDown:nt,navigatePrev:rt,navigateNext:ot,layout:k,availableRoutes:U,availableFragments:j,toggleOverview:T,togglePause:R,isOverview:M,isPaused:I,addEventListeners:s,removeEventListeners:c,getIndices:V,getSlide:function(e,t){var n=document.querySelectorAll(xt)[e],r=n&&n.querySelectorAll("section");return t!==void 0?r?r[t]:void 0:n},getPreviousSlide:function(){return St},getCurrentSlide:function(){return At},getScale:function(){return It},getConfig:function(){return Pt},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},isFirstSlide:function(){return null==document.querySelector(qt+".past")?!0:!1},isLastSlide:function(){return At&&At.classList.contains(".stack")?null==At.querySelector(qt+".future")?!0:!1:null==document.querySelector(qt+".future")?!0:!1},addEventListener:function(e,t,n){"addEventListener"in window&&(Ot.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&(Ot.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}();
\ No newline at end of file +var Reveal=function(){"use strict";function e(e){return t(),Ht||Rt?(window.addEventListener("load",T,!1),d(Ut,e),y(),n(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function t(){Rt="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,Ht="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,Yt=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function n(){function e(){n.length&&head.js.apply(null,n),r()}for(var t=[],n=[],o=0,a=Ut.dependencies.length;a>o;o++){var i=Ut.dependencies[o];(!i.condition||i.condition())&&(i.async?n.push(i.src):t.push(i.src),"function"==typeof i.callback&&head.ready(i.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],i.callback))}t.length?(head.ready(e),head.js.apply(null,t)):e()}function r(){a(),o(),c(),J(),setTimeout(function(){$t.slides.classList.remove("no-transition"),jt=!0,w("ready",{indexh:Pt,indexv:Dt,currentSlide:It})},1)}function o(){var e=f(document.querySelectorAll(Ot));e.forEach(function(e){var t=f(e.querySelectorAll("section"));t.forEach(function(e,t){t>0&&e.classList.add("future")})})}function a(){$t.theme=document.querySelector("#theme"),$t.wrapper=document.querySelector(".reveal"),$t.slides=document.querySelector(".reveal .slides"),$t.slides.classList.add("no-transition"),$t.background=i($t.wrapper,"div","backgrounds",null),$t.progress=i($t.wrapper,"div","progress","<span></span>"),$t.progressbar=$t.progress.querySelector("span"),i($t.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),i($t.wrapper,"div","state-background",null),i($t.wrapper,"div","pause-overlay",null),Ut.controls&&($t.controls=document.querySelector(".reveal .controls"),$t.controlsLeft=f(document.querySelectorAll(".navigate-left")),$t.controlsRight=f(document.querySelectorAll(".navigate-right")),$t.controlsUp=f(document.querySelectorAll(".navigate-up")),$t.controlsDown=f(document.querySelectorAll(".navigate-down")),$t.controlsPrev=f(document.querySelectorAll(".navigate-prev")),$t.controlsNext=f(document.querySelectorAll(".navigate-next")))}function i(e,t,n,r){var o=e.querySelector("."+n);return o||(o=document.createElement(t),o.classList.add(n),null!==r&&(o.innerHTML=r),e.appendChild(o)),o}function s(){function e(e,t){var n={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition")},r=document.createElement("div");return r.className="slide-background",n.background&&(/^(http|file|\/\/)/gi.test(n.background)||/\.(png|jpg|jpeg|gif|bmp)$/gi.test(n.background)?r.style.backgroundImage="url("+n.background+")":r.style.background=n.background),n.backgroundSize&&(r.style.backgroundSize=n.backgroundSize),n.backgroundImage&&(r.style.backgroundImage='url("'+n.backgroundImage+'")'),n.backgroundColor&&(r.style.backgroundColor=n.backgroundColor),n.backgroundRepeat&&(r.style.backgroundRepeat=n.backgroundRepeat),n.backgroundPosition&&(r.style.backgroundPosition=n.backgroundPosition),n.backgroundTransition&&r.setAttribute("data-background-transition",n.backgroundTransition),t.appendChild(r),r}h()&&document.body.classList.add("print-pdf"),$t.background.innerHTML="",$t.background.classList.add("no-transition"),f(document.querySelectorAll(Ot)).forEach(function(t){var n;n=h()?e(t,t):e(t,$t.background),f(t.querySelectorAll("section")).forEach(function(t){h()?e(t,t):e(t,n)})})}function c(e){if($t.wrapper.classList.remove(Ut.transition),"object"==typeof e&&d(Ut,e),Rt===!1&&(Ut.transition="linear"),$t.wrapper.classList.add(Ut.transition),$t.wrapper.setAttribute("data-transition-speed",Ut.transitionSpeed),$t.wrapper.setAttribute("data-background-transition",Ut.backgroundTransition),$t.controls&&($t.controls.style.display=Ut.controls&&$t.controls?"block":"none"),$t.progress&&($t.progress.style.display=Ut.progress&&$t.progress?"block":"none"),Ut.rtl?$t.wrapper.classList.add("rtl"):$t.wrapper.classList.remove("rtl"),Ut.center?$t.wrapper.classList.add("center"):$t.wrapper.classList.remove("center"),Ut.mouseWheel?(document.addEventListener("DOMMouseScroll",bt,!1),document.addEventListener("mousewheel",bt,!1)):(document.removeEventListener("DOMMouseScroll",bt,!1),document.removeEventListener("mousewheel",bt,!1)),Ut.rollingLinks?L():E(),Ut.previewLinks?k():(S(),k("[data-preview-link]")),Ut.theme&&$t.theme){var t=$t.theme.getAttribute("href"),n=/[^\/]*?(?=\.css)/,r=t.match(n)[0];Ut.theme!==r&&(t=t.replace(n,Ut.theme),$t.theme.setAttribute("href",t))}j()}function l(){Jt=!0,window.addEventListener("hashchange",xt,!1),window.addEventListener("resize",Tt,!1),Ut.touch&&($t.wrapper.addEventListener("touchstart",vt,!1),$t.wrapper.addEventListener("touchmove",pt,!1),$t.wrapper.addEventListener("touchend",gt,!1),window.navigator.msPointerEnabled&&($t.wrapper.addEventListener("MSPointerDown",mt,!1),$t.wrapper.addEventListener("MSPointerMove",ht,!1),$t.wrapper.addEventListener("MSPointerUp",yt,!1))),Ut.keyboard&&document.addEventListener("keydown",ft,!1),Ut.progress&&$t.progress&&$t.progress.addEventListener("click",wt,!1),Ut.controls&&$t.controls&&["touchstart","click"].forEach(function(e){$t.controlsLeft.forEach(function(t){t.addEventListener(e,Lt,!1)}),$t.controlsRight.forEach(function(t){t.addEventListener(e,Et,!1)}),$t.controlsUp.forEach(function(t){t.addEventListener(e,kt,!1)}),$t.controlsDown.forEach(function(t){t.addEventListener(e,St,!1)}),$t.controlsPrev.forEach(function(t){t.addEventListener(e,At,!1)}),$t.controlsNext.forEach(function(t){t.addEventListener(e,qt,!1)})})}function u(){Jt=!1,document.removeEventListener("keydown",ft,!1),window.removeEventListener("hashchange",xt,!1),window.removeEventListener("resize",Tt,!1),$t.wrapper.removeEventListener("touchstart",vt,!1),$t.wrapper.removeEventListener("touchmove",pt,!1),$t.wrapper.removeEventListener("touchend",gt,!1),window.navigator.msPointerEnabled&&($t.wrapper.removeEventListener("MSPointerDown",mt,!1),$t.wrapper.removeEventListener("MSPointerMove",ht,!1),$t.wrapper.removeEventListener("MSPointerUp",yt,!1)),Ut.progress&&$t.progress&&$t.progress.removeEventListener("click",wt,!1),Ut.controls&&$t.controls&&["touchstart","click"].forEach(function(e){$t.controlsLeft.forEach(function(t){t.removeEventListener(e,Lt,!1)}),$t.controlsRight.forEach(function(t){t.removeEventListener(e,Et,!1)}),$t.controlsUp.forEach(function(t){t.removeEventListener(e,kt,!1)}),$t.controlsDown.forEach(function(t){t.removeEventListener(e,St,!1)}),$t.controlsPrev.forEach(function(t){t.removeEventListener(e,At,!1)}),$t.controlsNext.forEach(function(t){t.removeEventListener(e,qt,!1)})})}function d(e,t){for(var n in t)e[n]=t[n]}function f(e){return Array.prototype.slice.call(e)}function v(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function p(e,t){e.style.WebkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function g(e){var t=0;if(e){var n=0;f(e.childNodes).forEach(function(e){"number"==typeof e.offsetTop&&e.style&&("absolute"===e.style.position&&(n+=1),t=Math.max(t,e.offsetTop+e.offsetHeight))}),0===n&&(t=e.offsetHeight)}return t}function m(e,t){if(t=t||0,e){var n=e.parentNode,r=n.childNodes;f(r).forEach(function(n){if("number"==typeof n.offsetHeight&&n!==e){var r=window.getComputedStyle(n),o=parseInt(r.marginTop,10),a=parseInt(r.marginBottom,10);t-=n.offsetHeight+o+a}});var o=window.getComputedStyle(e);t-=parseInt(o.marginTop,10)+parseInt(o.marginBottom,10)}return t}function h(){return/print-pdf/gi.test(window.location.search)}function y(){/iphone|ipod|android/gi.test(navigator.userAgent)&&!/crios/gi.test(navigator.userAgent)&&(window.addEventListener("load",b,!1),window.addEventListener("orientationchange",b,!1))}function b(){0===window.orientation?(document.documentElement.style.overflow="scroll",document.body.style.height="120%"):(document.documentElement.style.overflow="",document.body.style.height="100%"),setTimeout(function(){window.scrollTo(0,1)},10)}function w(e,t){var n=document.createEvent("HTMLEvents",1,2);n.initEvent(e,!0,!0),d(n,t),$t.wrapper.dispatchEvent(n)}function L(){if(Rt&&!("msPerspective"in document.body.style))for(var e=document.querySelectorAll(Xt+" a:not(.image)"),t=0,n=e.length;n>t;t++){var r=e[t];if(!(!r.textContent||r.querySelector("*")||r.className&&r.classList.contains(r,"roll"))){var o=document.createElement("span");o.setAttribute("data-title",r.text),o.innerHTML=r.innerHTML,r.classList.add("roll"),r.innerHTML="",r.appendChild(o)}}}function E(){for(var e=document.querySelectorAll(Xt+" a.roll"),t=0,n=e.length;n>t;t++){var r=e[t],o=r.querySelector("span");o&&(r.classList.remove("roll"),r.innerHTML=o.innerHTML)}}function k(e){var t=f(document.querySelectorAll(e?e:"a"));t.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",Nt,!1)})}function S(){var e=f(document.querySelectorAll("a"));e.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",Nt,!1)})}function A(e){q(),$t.preview=document.createElement("div"),$t.preview.classList.add("preview-link-overlay"),$t.wrapper.appendChild($t.preview),$t.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+e+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+e+'"></iframe>',"</div>"].join(""),$t.preview.querySelector("iframe").addEventListener("load",function(){$t.preview.classList.add("loaded")},!1),$t.preview.querySelector(".close").addEventListener("click",function(e){q(),e.preventDefault()},!1),$t.preview.querySelector(".external").addEventListener("click",function(){q()},!1),setTimeout(function(){$t.preview.classList.add("visible")},1)}function q(){$t.preview&&($t.preview.setAttribute("src",""),$t.preview.parentNode.removeChild($t.preview),$t.preview=null)}function x(e){var t=f(e);return t.forEach(function(e,t){e.hasAttribute("data-fragment-index")||e.setAttribute("data-fragment-index",t)}),t.sort(function(e,t){return e.getAttribute("data-fragment-index")-t.getAttribute("data-fragment-index")}),t}function T(){if($t.wrapper&&!h()){var e=$t.wrapper.offsetWidth,t=$t.wrapper.offsetHeight;e-=t*Ut.margin,t-=t*Ut.margin;var n=Ut.width,r=Ut.height,o=20;M(Ut.width,Ut.height,o),"string"==typeof n&&/%$/.test(n)&&(n=parseInt(n,10)/100*e),"string"==typeof r&&/%$/.test(r)&&(r=parseInt(r,10)/100*t),$t.slides.style.width=n+"px",$t.slides.style.height=r+"px",Kt=Math.min(e/n,t/r),Kt=Math.max(Kt,Ut.minScale),Kt=Math.min(Kt,Ut.maxScale),void 0===$t.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?p($t.slides,"translate(-50%, -50%) scale("+Kt+") translate(50%, 50%)"):$t.slides.style.zoom=Kt;for(var a=f(document.querySelectorAll(Xt)),i=0,s=a.length;s>i;i++){var c=a[i];"none"!==c.style.display&&(c.style.top=Ut.center?c.classList.contains("stack")?0:Math.max(-(g(c)/2)-o,-r/2)+"px":"")}K()}}function M(e,t,n){f($t.slides.querySelectorAll("section > .stretch")).forEach(function(r){var o=m(r,t-2*n);if(/(img|video)/gi.test(r.nodeName)){var a=r.naturalWidth||r.videoWidth,i=r.naturalHeight||r.videoHeight,s=Math.min(e/a,o/i);r.style.width=a*s+"px",r.style.height=i*s+"px"}else r.style.width=e+"px",r.style.height=o+"px"})}function N(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function P(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){var t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function D(){if(Ut.overview){at();var e=$t.wrapper.classList.contains("overview"),t=400>window.innerWidth?1e3:2500;$t.wrapper.classList.add("overview"),$t.wrapper.classList.remove("exit-overview"),clearTimeout(Qt),clearTimeout(Gt),Qt=setTimeout(function(){for(var n=document.querySelectorAll(Ot),r=0,o=n.length;o>r;r++){var a=n[r],i=Ut.rtl?-105:105;if(a.setAttribute("data-index-h",r),p(a,"translateZ(-"+t+"px) translate("+(r-Pt)*i+"%, 0%)"),a.classList.contains("stack"))for(var s=a.querySelectorAll("section"),c=0,l=s.length;l>c;c++){var u=r===Pt?Dt:P(a),d=s[c];d.setAttribute("data-index-h",r),d.setAttribute("data-index-v",c),p(d,"translate(0%, "+105*(c-u)+"%)"),d.addEventListener("click",Mt,!0)}else a.addEventListener("click",Mt,!0)}_(),T(),e||w("overviewshown",{indexh:Pt,indexv:Dt,currentSlide:It})},10)}}function C(){if(Ut.overview){clearTimeout(Qt),clearTimeout(Gt),$t.wrapper.classList.remove("overview"),$t.wrapper.classList.add("exit-overview"),Gt=setTimeout(function(){$t.wrapper.classList.remove("exit-overview")},10);for(var e=f(document.querySelectorAll(Xt)),t=0,n=e.length;n>t;t++){var r=e[t];r.style.display="",p(r,""),r.removeEventListener("click",Mt,!0)}U(Pt,Dt),ot(),w("overviewhidden",{indexh:Pt,indexv:Dt,currentSlide:It})}}function I(e){"boolean"==typeof e?e?D():C():R()?C():D()}function R(){return $t.wrapper.classList.contains("overview")}function H(e){return e=e?e:It,e&&!!e.parentNode.nodeName.match(/section/i)}function Y(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&t.apply(e)}function X(){var e=$t.wrapper.classList.contains("paused");at(),$t.wrapper.classList.add("paused"),e===!1&&w("paused")}function O(){var e=$t.wrapper.classList.contains("paused");$t.wrapper.classList.remove("paused"),ot(),e&&w("resumed")}function z(){W()?O():X()}function W(){return $t.wrapper.classList.contains("paused")}function U(e,t,n,r){Ct=It;var o=document.querySelectorAll(Ot);void 0===t&&(t=P(o[e])),Ct&&Ct.parentNode&&Ct.parentNode.classList.contains("stack")&&N(Ct.parentNode,Dt);var a=_t.concat();_t.length=0;var i=Pt||0,s=Dt||0;Pt=F(Ot,void 0===e?Pt:e),Dt=F(zt,void 0===t?Dt:t),_(),T();e:for(var c=0,l=_t.length;l>c;c++){for(var u=0;a.length>u;u++)if(a[u]===_t[c]){a.splice(u,1);continue e}document.documentElement.classList.add(_t[c]),w(_t[c])}for(;a.length;)document.documentElement.classList.remove(a.pop());R()&&D();var d=o[Pt],v=d.querySelectorAll("section");if(It=v[Dt]||d,n!==void 0){var p=x(It.querySelectorAll(".fragment"));f(p).forEach(function(e,t){n>t?e.classList.add("visible"):e.classList.remove("visible")})}var g=Pt!==i||Dt!==s;g?w("slidechanged",{indexh:Pt,indexv:Dt,previousSlide:Ct,currentSlide:It,origin:r}):Ct=null,Ct&&(Ct.classList.remove("present"),document.querySelector(Wt).classList.contains("present")&&setTimeout(function(){var e,t=f(document.querySelectorAll(Ot+".stack"));for(e in t)t[e]&&N(t[e],0)},0)),g&&(G(Ct),Q(It)),$(),K(),V(),et()}function j(){u(),l(),T(),Ft=Ut.autoSlide,ot(),s(),$(),K(),V()}function F(e,t){var n=f(document.querySelectorAll(e)),r=n.length;if(r){Ut.loop&&(t%=r,0>t&&(t=r+t)),t=Math.max(Math.min(t,r-1),0);for(var o=0;r>o;o++){var a=n[o],i=Ut.rtl&&!H(a);if(a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),a.setAttribute("hidden",""),t>o)a.classList.add(i?"future":"past");else if(o>t){a.classList.add(i?"past":"future");for(var s=f(a.querySelectorAll(".fragment.visible"));s.length;)s.pop().classList.remove("visible")}a.querySelector("section")&&a.classList.add("stack")}n[t].classList.add("present"),n[t].removeAttribute("hidden");var c=n[t].getAttribute("data-state");c&&(_t=_t.concat(c.split(" ")));var l=n[t].getAttribute("data-autoslide");Ft=l?parseInt(l,10):Ut.autoSlide,ot()}else t=0;return t}function _(){var e,t,n=f(document.querySelectorAll(Ot)),r=n.length;if(r){var o=R()?10:Ut.viewDistance;Yt&&(o=R()?6:1);for(var a=0;r>a;a++){var i=n[a],s=f(i.querySelectorAll("section")),c=s.length;if(e=Math.abs((Pt-a)%(r-o))||0,i.style.display=e>o?"none":"block",c)for(var l=P(i),u=0;c>u;u++){var d=s[u];t=a===Pt?Math.abs(Dt-u):Math.abs(u-l),d.style.display=e+t>o?"none":"block"}}}}function K(){if(Ut.progress&&$t.progress){var e=f(document.querySelectorAll(Ot)),t=document.querySelectorAll(Xt+":not(.stack)").length,n=0;e:for(var r=0;e.length>r;r++){for(var o=e[r],a=f(o.querySelectorAll("section")),i=0;a.length>i;i++){if(a[i].classList.contains("present"))break e;n++}if(o.classList.contains("present"))break;o.classList.contains("stack")===!1&&n++}$t.progressbar.style.width=n/(t-1)*window.innerWidth+"px"}}function $(){if(Ut.controls&&$t.controls){var e=B(),t=Z();$t.controlsLeft.concat($t.controlsRight).concat($t.controlsUp).concat($t.controlsDown).concat($t.controlsPrev).concat($t.controlsNext).forEach(function(e){e.classList.remove("enabled"),e.classList.remove("fragmented")}),e.left&&$t.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&$t.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&$t.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&$t.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&$t.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&$t.controlsNext.forEach(function(e){e.classList.add("enabled")}),It&&(t.prev&&$t.controlsPrev.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&$t.controlsNext.forEach(function(e){e.classList.add("fragmented","enabled")}),H(It)?(t.prev&&$t.controlsUp.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&$t.controlsDown.forEach(function(e){e.classList.add("fragmented","enabled")})):(t.prev&&$t.controlsLeft.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&$t.controlsRight.forEach(function(e){e.classList.add("fragmented","enabled")})))}}function V(){f($t.background.childNodes).forEach(function(e,t){var n=Ut.rtl?"future":"past",r=Ut.rtl?"past":"future";e.className="slide-background "+(Pt>t?n:t>Pt?r:"present"),f(e.childNodes).forEach(function(e,t){e.className="slide-background "+(Dt>t?"past":t>Dt?"future":"present")})}),setTimeout(function(){$t.background.classList.remove("no-transition")},1)}function B(){var e=document.querySelectorAll(Ot),t=document.querySelectorAll(zt),n={left:Pt>0||Ut.loop,right:e.length-1>Pt||Ut.loop,up:Dt>0,down:t.length-1>Dt};if(Ut.rtl){var r=n.left;n.left=n.right,n.right=r}return n}function Z(){if(It&&Ut.fragments){var e=It.querySelectorAll(".fragment"),t=It.querySelectorAll(".fragment:not(.visible)");return{prev:e.length-t.length>0,next:!!t.length}}return{prev:!1,next:!1}}function Q(e){e&&(f(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&e.play()}),f(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-autoplay")&&e.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function G(e){e&&(f(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-ignore")||e.pause()}),f(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function J(){var e=window.location.hash,t=e.slice(2).split("/"),n=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&n.length){var r=document.querySelector("#"+n);if(r){var o=Reveal.getIndices(r);U(o.h,o.v)}else U(Pt||0,Dt||0)}else{var a=parseInt(t[0],10)||0,i=parseInt(t[1],10)||0;(a!==Pt||i!==Dt)&&U(a,i)}}function et(e){if(Ut.history)if(clearTimeout(Zt),"number"==typeof e)Zt=setTimeout(et,e);else{var t="/";It&&"string"==typeof It.getAttribute("id")?t="/"+It.getAttribute("id"):((Pt>0||Dt>0)&&(t+=Pt),Dt>0&&(t+="/"+Dt)),window.location.hash=t}}function tt(e){var t,n=Pt,r=Dt;if(e){var o=H(e),a=o?e.parentNode:e,i=f(document.querySelectorAll(Ot));n=Math.max(i.indexOf(a),0),o&&(r=Math.max(f(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&It){var s=It.querySelectorAll(".fragment").length>0;if(s){var c=It.querySelectorAll(".fragment.visible");t=c.length}}return{h:n,v:r,f:t}}function nt(){if(It&&Ut.fragments){var e=x(It.querySelectorAll(".fragment:not(.visible)"));if(e.length){var t=e[0].getAttribute("data-fragment-index");return e=It.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),f(e).forEach(function(e){e.classList.add("visible")}),w("fragmentshown",{fragment:e[0],fragments:e}),$(),!0}}return!1}function rt(){if(It&&Ut.fragments){var e=x(It.querySelectorAll(".fragment.visible"));if(e.length){var t=e[e.length-1].getAttribute("data-fragment-index");return e=It.querySelectorAll('.fragment[data-fragment-index="'+t+'"]'),f(e).forEach(function(e){e.classList.remove("visible")}),w("fragmenthidden",{fragment:e[0],fragments:e}),$(),!0}}return!1}function ot(){clearTimeout(Bt),!Ft||W()||R()||(Bt=setTimeout(dt,Ft))}function at(){clearTimeout(Bt)}function it(){Ut.rtl?(R()||nt()===!1)&&B().left&&U(Pt+1):(R()||rt()===!1)&&B().left&&U(Pt-1)}function st(){Ut.rtl?(R()||rt()===!1)&&B().right&&U(Pt-1):(R()||nt()===!1)&&B().right&&U(Pt+1)}function ct(){(R()||rt()===!1)&&B().up&&U(Pt,Dt-1)}function lt(){(R()||nt()===!1)&&B().down&&U(Pt,Dt+1)}function ut(){if(rt()===!1)if(B().up)ct();else{var e=document.querySelector(Ot+".past:nth-child("+Pt+")");if(e){var t=e.querySelectorAll("section").length-1||void 0,n=Pt-1;U(n,t)}}}function dt(){nt()===!1&&(B().down?lt():st()),ot()}function ft(e){document.activeElement;var t=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(t||e.shiftKey&&32!==e.keyCode||e.altKey||e.ctrlKey||e.metaKey)){if(W()&&-1===[66,190,191].indexOf(e.keyCode))return!1;var n=!1;if("object"==typeof Ut.keyboard)for(var r in Ut.keyboard)if(parseInt(r,10)===e.keyCode){var o=Ut.keyboard[r];"function"==typeof o?o.apply(null,[e]):"string"==typeof o&&"function"==typeof Reveal[o]&&Reveal[o].call(),n=!0}if(n===!1)switch(n=!0,e.keyCode){case 80:case 33:ut();break;case 78:case 34:dt();break;case 72:case 37:it();break;case 76:case 39:st();break;case 75:case 38:ct();break;case 74:case 40:lt();break;case 36:U(0);break;case 35:U(Number.MAX_VALUE);break;case 32:R()?C():e.shiftKey?ut():dt();break;case 13:R()?C():n=!1;break;case 66:case 190:case 191:z();break;case 70:Y();break;default:n=!1}n?e.preventDefault():27!==e.keyCode&&79!==e.keyCode||!Rt||(I(),e.preventDefault()),ot()}}function vt(e){en.startX=e.touches[0].clientX,en.startY=e.touches[0].clientY,en.startCount=e.touches.length,2===e.touches.length&&Ut.overview&&(en.startSpan=v({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:en.startX,y:en.startY}))}function pt(e){if(en.captured)navigator.userAgent.match(/android/gi)&&e.preventDefault();else{var t=e.touches[0].clientX,n=e.touches[0].clientY;if(2===e.touches.length&&2===en.startCount&&Ut.overview){var r=v({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:en.startX,y:en.startY});Math.abs(en.startSpan-r)>en.threshold&&(en.captured=!0,en.startSpan>r?D():C()),e.preventDefault()}else if(1===e.touches.length&&2!==en.startCount){var o=t-en.startX,a=n-en.startY;o>en.threshold&&Math.abs(o)>Math.abs(a)?(en.captured=!0,it()):-en.threshold>o&&Math.abs(o)>Math.abs(a)?(en.captured=!0,st()):a>en.threshold?(en.captured=!0,ct()):-en.threshold>a&&(en.captured=!0,lt()),Ut.embedded?(en.captured||H(It))&&e.preventDefault():e.preventDefault()}}}function gt(){en.captured=!1}function mt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],vt(e))}function ht(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],pt(e))}function yt(e){e.pointerType===e.MSPOINTER_TYPE_TOUCH&&(e.touches=[{clientX:e.clientX,clientY:e.clientY}],gt(e))}function bt(e){if(Date.now()-Vt>600){Vt=Date.now();var t=e.detail||-e.wheelDelta;t>0?dt():ut()}}function wt(e){e.preventDefault();var t=f(document.querySelectorAll(Ot)).length,n=Math.floor(e.clientX/$t.wrapper.offsetWidth*t);U(n)}function Lt(e){e.preventDefault(),it()}function Et(e){e.preventDefault(),st()}function kt(e){e.preventDefault(),ct()}function St(e){e.preventDefault(),lt()}function At(e){e.preventDefault(),ut()}function qt(e){e.preventDefault(),dt()}function xt(){J()}function Tt(){T()}function Mt(e){if(Jt&&R()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(C(),t.nodeName.match(/section/gi))){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);U(n,r)}}}function Nt(e){var t=e.target.getAttribute("href");t&&(A(t),e.preventDefault())}var Pt,Dt,Ct,It,Rt,Ht,Yt,Xt=".reveal .slides section",Ot=".reveal .slides>section",zt=".reveal .slides>section.present>section",Wt=".reveal .slides>section:first-child",Ut={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!1,previewLinks:!1,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",viewDistance:3,dependencies:[]},jt=!1,Ft=0,_t=[],Kt=1,$t={},Vt=0,Bt=0,Zt=0,Qt=0,Gt=0,Jt=!1,en={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return{initialize:e,configure:c,sync:j,slide:U,left:it,right:st,up:ct,down:lt,prev:ut,next:dt,prevFragment:rt,nextFragment:nt,navigateTo:U,navigateLeft:it,navigateRight:st,navigateUp:ct,navigateDown:lt,navigatePrev:ut,navigateNext:dt,layout:T,availableRoutes:B,availableFragments:Z,toggleOverview:I,togglePause:z,isOverview:R,isPaused:W,addEventListeners:l,removeEventListeners:u,getIndices:tt,getSlide:function(e,t){var n=document.querySelectorAll(Ot)[e],r=n&&n.querySelectorAll("section");return t!==void 0?r?r[t]:void 0:n},getPreviousSlide:function(){return Ct},getCurrentSlide:function(){return It},getScale:function(){return Kt},getConfig:function(){return Ut},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},isFirstSlide:function(){return null==document.querySelector(Xt+".past")?!0:!1},isLastSlide:function(){return It&&It.classList.contains(".stack")?null==It.querySelector(Xt+".future")?!0:!1:null==document.querySelector(Xt+".future")?!0:!1},isReady:function(){return jt},addEventListener:function(e,t,n){"addEventListener"in window&&($t.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&($t.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}();
\ No newline at end of file |