expose layout api method (closes #305), consistent spacing across all functions in...
authorhakimel <hakim.elhattab@gmail.com>
Mon, 21 Jan 2013 17:22:30 +0000 (12:22 -0500)
committerhakimel <hakim.elhattab@gmail.com>
Mon, 21 Jan 2013 17:22:30 +0000 (12:22 -0500)
js/reveal.js
js/reveal.min.js

index c1a1dfc5682945a5fd992e28de0a0478294e0ae9..affa4dc554c38d36df33d5482ca338e145c9a610 100644 (file)
@@ -88,6 +88,7 @@ var Reveal = (function(){
                                                                'OPerspective' in document.body.style ||
                                                                'perspective' in document.body.style,
 
+               // Detect support for CSS 2D transforms
                supports2DTransforms =  'WebkitTransform' in document.body.style ||
                                                                'MozTransform' in document.body.style ||
                                                                'msTransform' in document.body.style ||
@@ -123,6 +124,7 @@ var Reveal = (function(){
         * Starts up the presentation if the client is capable.
         */
        function initialize( options ) {
+
                if( ( !supports2DTransforms && !supports3DTransforms ) ) {
                        document.body.setAttribute( 'class', 'no-transforms' );
 
@@ -151,6 +153,7 @@ var Reveal = (function(){
         * not found, it is created.
         */
        function setupDOM() {
+
                // Cache references to key DOM elements
                dom.theme = document.querySelector( '#theme' );
                dom.wrapper = document.querySelector( '.reveal' );
@@ -204,12 +207,14 @@ var Reveal = (function(){
                        dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
                        dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
                }
+
        }
 
        /**
         * Hides the address bar if we're on a mobile device.
         */
        function hideAddressBar() {
+
                if( navigator.userAgent.match( /(iphone|ipod)/i ) ) {
                        // Give the page some scrollable overflow
                        document.documentElement.style.overflow = 'scroll';
@@ -219,6 +224,7 @@ var Reveal = (function(){
                        window.addEventListener( 'load', removeAddressBar, false );
                        window.addEventListener( 'orientationchange', removeAddressBar, false );
                }
+
        }
 
        /**
@@ -229,6 +235,7 @@ var Reveal = (function(){
         * will load after reveal.js has been started up.
         */
        function load() {
+
                var scripts = [],
                        scriptsAsync = [];
 
@@ -270,6 +277,7 @@ var Reveal = (function(){
                else {
                        proceed();
                }
+
        }
 
        /**
@@ -277,6 +285,7 @@ var Reveal = (function(){
         * to the current URL deeplink if there is one.
         */
        function start() {
+
                // Make sure we've got all the DOM elements we need
                setupDOM();
 
@@ -305,12 +314,14 @@ var Reveal = (function(){
                                'currentSlide': currentSlide
                        } );
                }, 1 );
+
        }
 
        /**
         * Applies the configuration settings from the config object.
         */
        function configure() {
+
                if( supports3DTransforms === false ) {
                        config.transition = 'linear';
                }
@@ -356,12 +367,14 @@ var Reveal = (function(){
                                dom.theme.setAttribute( 'href', themeURL );
                        }
                }
+
        }
 
        /**
         * Binds all event listeners.
         */
        function addEventListeners() {
+
                document.addEventListener( 'touchstart', onDocumentTouchStart, false );
                document.addEventListener( 'touchmove', onDocumentTouchMove, false );
                document.addEventListener( 'touchend', onDocumentTouchEnd, false );
@@ -385,12 +398,14 @@ var Reveal = (function(){
                        dom.controlsPrev.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigatePrev ), false ); } );
                        dom.controlsNext.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateNext ), false ); } );
                }
+
        }
 
        /**
         * Unbinds all event listeners.
         */
        function removeEventListeners() {
+
                document.removeEventListener( 'keydown', onDocumentKeyDown, false );
                document.removeEventListener( 'touchstart', onDocumentTouchStart, false );
                document.removeEventListener( 'touchmove', onDocumentTouchMove, false );
@@ -411,6 +426,7 @@ var Reveal = (function(){
                        dom.controlsPrev.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigatePrev ), false ); } );
                        dom.controlsNext.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateNext ), false ); } );
                }
+
        }
 
        /**
@@ -418,22 +434,20 @@ var Reveal = (function(){
         * If there's a conflict, object b takes precedence.
         */
        function extend( a, b ) {
+
                for( var i in b ) {
                        a[ i ] = b[ i ];
                }
+
        }
 
        /**
         * Converts the target object to an array.
         */
        function toArray( o ) {
+
                return Array.prototype.slice.call( o );
-       }
 
-       function each( targets, method, args ) {
-               targets.forEach( function( el ) {
-                       el[method].apply( el, args );
-               } );
        }
 
        /**
@@ -444,10 +458,12 @@ var Reveal = (function(){
         * @param {Object} b point with x/y properties
         */
        function distanceBetween( a, b ) {
+
                var dx = a.x - b.x,
                        dy = a.y - b.y;
 
                return Math.sqrt( dx*dx + dy*dy );
+
        }
 
        /**
@@ -458,10 +474,12 @@ var Reveal = (function(){
         * after the wrapper has been executed
         */
        function preventAndForward( delegate ) {
+
                return function( event ) {
                        event.preventDefault();
                        delegate.call( null, event );
                };
+
        }
 
        /**
@@ -469,9 +487,11 @@ var Reveal = (function(){
         * more vertical space ftw.
         */
        function removeAddressBar() {
+
                setTimeout( function() {
                        window.scrollTo( 0, 1 );
                }, 0 );
+
        }
 
        /**
@@ -479,16 +499,19 @@ var Reveal = (function(){
         * reveal DOM element.
         */
        function dispatchEvent( type, properties ) {
+
                var event = document.createEvent( "HTMLEvents", 1, 2 );
                event.initEvent( type, true, true );
                extend( event, properties );
                dom.wrapper.dispatchEvent( event );
+
        }
 
        /**
         * Wrap all links in 3D goodness.
         */
        function linkify() {
+
                if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) {
                        var nodes = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
 
@@ -506,6 +529,7 @@ var Reveal = (function(){
                                }
                        }
                }
+
        }
 
        /**
@@ -525,7 +549,7 @@ var Reveal = (function(){
                        for( var i = 0, len = slides.length; i < len; i++ ) {
                                var slide = slides[ i ];
 
-                               // Don't bother update invisible slides
+                               // Don't bother updating invisible slides
                                if( slide.style.display === 'none' ) {
                                        continue;
                                }
@@ -545,17 +569,19 @@ var Reveal = (function(){
        }
 
        /**
-        * Stores the vertical index of a stack so that the same 
-        * vertical slide can be selected when navigating to and 
+        * Stores the vertical index of a stack so that the same
+        * vertical slide can be selected when navigating to and
         * from the stack.
-        * 
+        *
         * @param {HTMLElement} stack The vertical stack element
         * @param {int} v Index to memorize
         */
        function setPreviousVerticalIndex( stack, v ) {
+
                if( stack ) {
                        stack.setAttribute( 'data-previous-indexv', v || 0 );
                }
+
        }
 
        /**
@@ -566,11 +592,13 @@ var Reveal = (function(){
         * @param {HTMLElement} stack The vertical stack element
         */
        function getPreviousVerticalIndex( stack ) {
+
                if( stack && stack.classList.contains( 'stack' ) ) {
                        return parseInt( stack.getAttribute( 'data-previous-indexv' ) || 0, 10 );
                }
 
                return 0;
+
        }
 
        /**
@@ -593,7 +621,7 @@ var Reveal = (function(){
 
                        // Not the pretties solution, but need to let the overview 
                        // class apply first so that slides are measured accurately 
-                       // before we can positon them
+                       // before we can position them
                        activateOverviewTimeout = setTimeout( function(){
 
                                var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
@@ -704,12 +732,14 @@ var Reveal = (function(){
         * overview is open, false means it's closed.
         */
        function toggleOverview( override ) {
+
                if( typeof override === 'boolean' ) {
                        override ? activateOverview() : deactivateOverview();
                }
                else {
                        isOverviewActive() ? deactivateOverview() : activateOverview();
                }
+
        }
 
        /**
@@ -719,7 +749,9 @@ var Reveal = (function(){
         * false otherwise
         */
        function isOverviewActive() {
+
                return dom.wrapper.classList.contains( 'overview' );
+
        }
 
        /**
@@ -729,6 +761,7 @@ var Reveal = (function(){
         * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode
         */
        function enterFullscreen() {
+
                var element = document.body;
 
                // Check which implementation is available
@@ -740,6 +773,7 @@ var Reveal = (function(){
                if( requestMethod ) {
                        requestMethod.apply( element );
                }
+
        }
 
        /**
@@ -747,33 +781,41 @@ var Reveal = (function(){
         * black.
         */
        function pause() {
+
                dom.wrapper.classList.add( 'paused' );
+
        }
 
        /**
         * Exits from the paused mode.
         */
        function resume() {
+
                dom.wrapper.classList.remove( 'paused' );
+
        }
 
        /**
         * Toggles the paused mode on and off.
         */
        function togglePause() {
+
                if( isPaused() ) {
                        resume();
                }
                else {
                        pause();
                }
+
        }
 
        /**
         * Checks if we are currently in the paused mode.
         */
        function isPaused() {
+
                return dom.wrapper.classList.contains( 'paused' );
+
        }
 
        /**
@@ -783,23 +825,24 @@ var Reveal = (function(){
         *
         * @param {int} h Horizontal index of the target slide
         * @param {int} v Vertical index of the target slide
-        * @param {int} f Optional index of a fragment within the 
+        * @param {int} f Optional index of a fragment within the
         * target slide to activate
         */
        function slide( h, v, f ) {
+
                // Remember where we were at before
                previousSlide = currentSlide;
 
                // Query all horizontal slides in the deck
                var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
 
-               // If no vertical index is specified and the upcoming slide is a 
+               // If no vertical index is specified and the upcoming slide is a
                // stack, resume at its previous vertical index
                if( v === undefined ) {
                        v = getPreviousVerticalIndex( horizontalSlides[ h ] );
                }
 
-               // If we were on a vertical stack, remember what vertical index 
+               // If we were on a vertical stack, remember what vertical index
                // it was on so we can resume at the same position when returning
                if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {
                        setPreviousVerticalIndex( previousSlide.parentNode, indexv );
@@ -837,7 +880,7 @@ var Reveal = (function(){
                        dispatchEvent( state[i] );
                }
 
-               // Clean up the remaints of the previous state
+               // Clean up the remains of the previous state
                while( stateBefore.length ) {
                        document.documentElement.classList.remove( stateBefore.pop() );
                }
@@ -912,6 +955,7 @@ var Reveal = (function(){
 
                updateControls();
                updateProgress();
+
        }
 
        /**
@@ -928,6 +972,7 @@ var Reveal = (function(){
         * bounds.
         */
        function updateSlides( selector, index ) {
+
                // Select all slides and convert the NodeList result to
                // an array
                var slides = toArray( document.querySelectorAll( selector ) ),
@@ -1014,6 +1059,7 @@ var Reveal = (function(){
         * Updates the progress bar to reflect the current slide.
         */
        function updateProgress() {
+
                // Update progress if enabled
                if( config.progress && dom.progress ) {
 
@@ -1055,12 +1101,14 @@ var Reveal = (function(){
                        dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px';
 
                }
+
        }
 
        /**
         * Updates the state of all control/navigation arrows.
         */
        function updateControls() {
+
                if ( config.controls && dom.controls ) {
 
                        var routes = availableRoutes();
@@ -1085,6 +1133,7 @@ var Reveal = (function(){
                        if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
 
                }
+
        }
 
        /**
@@ -1093,6 +1142,7 @@ var Reveal = (function(){
         * @return {Object} containing four booleans: left/right/up/down
         */
        function availableRoutes() {
+
                var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
                        verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
 
@@ -1102,12 +1152,14 @@ var Reveal = (function(){
                        up: indexv > 0,
                        down: indexv < verticalSlides.length - 1
                };
+
        }
 
        /**
         * Reads the current URL (hash) and navigates accordingly.
         */
        function readURL() {
+
                var hash = window.location.hash;
 
                // Attempt to parse the hash as either an index or name
@@ -1137,16 +1189,18 @@ var Reveal = (function(){
 
                        slide( h, v );
                }
+
        }
 
        /**
         * Updates the page URL (hash) to reflect the current
         * state.
         *
-        * @param {Number} delay The time in ms to wait before 
+        * @param {Number} delay The time in ms to wait before
         * writing the hash
         */
        function writeURL( delay ) {
+
                if( config.history ) {
 
                        // Make sure there's never more than one timeout running
@@ -1172,6 +1226,7 @@ var Reveal = (function(){
                                window.location.hash = url;
                        }
                }
+
        }
 
        /**
@@ -1185,6 +1240,7 @@ var Reveal = (function(){
         * @return {Object} { h: <int>, v: <int> }
         */
        function getIndices( slide ) {
+
                // By default, return the current indices
                var h = indexh,
                        v = indexv;
@@ -1207,6 +1263,7 @@ var Reveal = (function(){
                }
 
                return { h: h, v: v };
+
        }
 
        /**
@@ -1216,6 +1273,7 @@ var Reveal = (function(){
         * false otherwise
         */
        function nextFragment() {
+
                // Vertical slides:
                if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
                        var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
@@ -1240,6 +1298,7 @@ var Reveal = (function(){
                }
 
                return false;
+
        }
 
        /**
@@ -1249,6 +1308,7 @@ var Reveal = (function(){
         * false otherwise
         */
        function previousFragment() {
+
                // Vertical slides:
                if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
                        var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' );
@@ -1273,46 +1333,57 @@ var Reveal = (function(){
                }
 
                return false;
+
        }
 
        /**
         * Cues a new automated slide if enabled in the config.
         */
        function cueAutoSlide() {
+
                clearTimeout( autoSlideTimeout );
 
                // Cue the next auto-slide if enabled
                if( autoSlide ) {
                        autoSlideTimeout = setTimeout( navigateNext, autoSlide );
                }
+
        }
 
        function navigateLeft() {
+
                // Prioritize hiding fragments
                if( availableRoutes().left && isOverviewActive() || previousFragment() === false ) {
                        slide( indexh - 1 );
                }
+
        }
 
        function navigateRight() {
+
                // Prioritize revealing fragments
                if( availableRoutes().right && isOverviewActive() || nextFragment() === false ) {
                        slide( indexh + 1 );
                }
+
        }
 
        function navigateUp() {
+
                // Prioritize hiding fragments
                if( availableRoutes().up && isOverviewActive() || previousFragment() === false ) {
                        slide( indexh, indexv - 1 );
                }
+
        }
 
        function navigateDown() {
+
                // Prioritize revealing fragments
                if( availableRoutes().down && isOverviewActive() || nextFragment() === false ) {
                        slide( indexh, indexv + 1 );
                }
+
        }
 
        /**
@@ -1322,6 +1393,7 @@ var Reveal = (function(){
         * 3) Previous horizontal slide
         */
        function navigatePrev() {
+
                // Prioritize revealing fragments
                if( previousFragment() === false ) {
                        if( availableRoutes().up ) {
@@ -1338,12 +1410,14 @@ var Reveal = (function(){
                                }
                        }
                }
+
        }
 
        /**
         * Same as #navigatePrev() but navigates forwards.
         */
        function navigateNext() {
+
                // Prioritize revealing fragments
                if( nextFragment() === false ) {
                        availableRoutes().down ? navigateDown() : navigateRight();
@@ -1352,6 +1426,7 @@ var Reveal = (function(){
                // If auto-sliding is enabled we need to cue up
                // another timeout
                cueAutoSlide();
+
        }
 
 
@@ -1366,12 +1441,13 @@ var Reveal = (function(){
         * @param {Object} event
         */
        function onDocumentKeyDown( event ) {
-               // Check if there's a focused element that could be using 
+
+               // Check if there's a focused element that could be using
                // the keyboard
                var activeElement = document.activeElement;
                var hasFocus = !!( document.activeElement && ( document.activeElement.type || document.activeElement.href || document.activeElement.contentEditable !== 'inherit' ) );
 
-               // Disregard the event if there's a focused element or a 
+               // Disregard the event if there's a focused element or a
                // keyboard modifier key is present
                if ( hasFocus || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
 
@@ -1428,6 +1504,7 @@ var Reveal = (function(){
         * enables support for swipe and pinch gestures.
         */
        function onDocumentTouchStart( event ) {
+
                touch.startX = event.touches[0].clientX;
                touch.startY = event.touches[0].clientY;
                touch.startCount = event.touches.length;
@@ -1443,12 +1520,14 @@ var Reveal = (function(){
                                y: touch.startY
                        } );
                }
+
        }
 
        /**
         * Handler for the document level 'touchmove' event.
         */
        function onDocumentTouchMove( event ) {
+
                // Each touch should only trigger one action
                if( !touch.handled ) {
                        var currentX = event.touches[0].clientX;
@@ -1515,20 +1594,24 @@ var Reveal = (function(){
                else if( navigator.userAgent.match( /android/gi ) ) {
                        event.preventDefault();
                }
+
        }
 
        /**
         * Handler for the document level 'touchend' event.
         */
        function onDocumentTouchEnd( event ) {
+
                touch.handled = false;
+
        }
 
        /**
         * Handles mouse wheel scrolling, throttled to avoid skipping
         * multiple slides.
         */
-       function onDocumentMouseScroll( event ){
+       function onDocumentMouseScroll( event ) {
+
                clearTimeout( mouseWheelTimeout );
 
                mouseWheelTimeout = setTimeout( function() {
@@ -1540,6 +1623,7 @@ var Reveal = (function(){
                                navigatePrev();
                        }
                }, 100 );
+
        }
 
        /**
@@ -1549,30 +1633,37 @@ var Reveal = (function(){
         * ( clickX / presentationWidth ) * numberOfSlides
         */
        function onProgressClick( event ) {
+
                var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
                var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal );
 
                slide( slideIndex );
+
        }
 
        /**
         * Handler for the window level 'hashchange' event.
         */
        function onWindowHashChange( event ) {
+
                readURL();
+
        }
 
        /**
         * Handler for the window level 'resize' event.
         */
        function onWindowResize( event ) {
+
                layout();
+
        }
 
        /**
         * Invoked when a slide is and we're in the overview.
         */
        function onOverviewSlideClicked( event ) {
+
                // TODO There's a bug here where the event listeners are not
                // removed after deactivating the overview.
                if( isOverviewActive() ) {
@@ -1593,6 +1684,7 @@ var Reveal = (function(){
                                slide( h, v );
                        }
                }
+
        }
 
 
@@ -1624,6 +1716,9 @@ var Reveal = (function(){
                navigatePrev: navigatePrev,
                navigateNext: navigateNext,
 
+               // Forces an update in slide layout
+               layout: layout,
+
                // Toggles the overview mode on/off
                toggleOverview: toggleOverview,
 
index 414bd63aa2ac888608cdb9a2287e17293ff658ab..dfe23c1c2feb6ac97a2fd843bb6a6765660f54eb 100644 (file)
@@ -5,4 +5,4 @@
  *
  * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
  */
-var Reveal=function(){"use strict";function w(e){if(!p&&!h){document.body.setAttribute("class","no-transforms");return}window.addEventListener("load",B,!1),L(i,e),S(),x()}function E(){c.theme=document.querySelector("#theme"),c.wrapper=document.querySelector(".reveal"),c.slides=document.querySelector(".reveal .slides");if(!c.wrapper.querySelector(".progress")&&i.progress){var e=document.createElement("div");e.classList.add("progress"),e.innerHTML="<span></span>",c.wrapper.appendChild(e)}if(!c.wrapper.querySelector(".controls")&&i.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>',c.wrapper.appendChild(t)}if(!c.wrapper.querySelector(".state-background")){var n=document.createElement("div");n.classList.add("state-background"),c.wrapper.appendChild(n)}if(!c.wrapper.querySelector(".pause-overlay")){var r=document.createElement("div");r.classList.add("pause-overlay"),c.wrapper.appendChild(r)}c.progress=document.querySelector(".reveal .progress"),c.progressbar=document.querySelector(".reveal .progress span"),i.controls&&(c.controls=document.querySelector(".reveal .controls"),c.controlsLeft=A(document.querySelectorAll(".navigate-left")),c.controlsRight=A(document.querySelectorAll(".navigate-right")),c.controlsUp=A(document.querySelectorAll(".navigate-up")),c.controlsDown=A(document.querySelectorAll(".navigate-down")),c.controlsPrev=A(document.querySelectorAll(".navigate-prev")),c.controlsNext=A(document.querySelectorAll(".navigate-next")))}function S(){navigator.userAgent.match(/(iphone|ipod)/i)&&(document.documentElement.style.overflow="scroll",document.body.style.height="120%",window.addEventListener("load",D,!1),window.addEventListener("orientationchange",D,!1))}function x(){function o(){t.length&&head.js.apply(null,t),T()}var e=[],t=[];for(var n=0,r=i.dependencies.length;n<r;n++){var s=i.dependencies[n];if(!s.condition||s.condition())s.async?t.push(s.src):e.push(s.src),typeof s.callback=="function"&&head.ready(s.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],s.callback)}e.length?(head.ready(o),head.js.apply(null,e)):o()}function T(){E(),C(),N(),B(),Z(),it(),setTimeout(function(){P("ready",{indexh:o,indexv:u,currentSlide:f})},1)}function N(){h===!1&&(i.transition="linear"),i.controls&&c.controls&&(c.controls.style.display="block"),i.progress&&c.progress&&(c.progress.style.display="block"),i.transition!=="default"&&c.wrapper.classList.add(i.transition),i.rtl&&c.wrapper.classList.add("rtl"),i.center&&c.wrapper.classList.add("center"),i.mouseWheel&&(document.addEventListener("DOMMouseScroll",vt,!1),document.addEventListener("mousewheel",vt,!1)),i.rollingLinks&&H();if(i.theme&&c.theme){var e=c.theme.getAttribute("href"),t=/[^\/]*?(?=\.css)/,n=e.match(t)[0];i.theme!==n&&(e=e.replace(t,i.theme),c.theme.setAttribute("href",e))}}function C(){document.addEventListener("touchstart",ht,!1),document.addEventListener("touchmove",pt,!1),document.addEventListener("touchend",dt,!1),window.addEventListener("hashchange",gt,!1),window.addEventListener("resize",yt,!1),i.keyboard&&document.addEventListener("keydown",ct,!1),i.progress&&c.progress&&c.progress.addEventListener("click",_(mt),!1);if(i.controls&&c.controls){var e="ontouchstart"in window?"touchstart":"click";c.controlsLeft.forEach(function(t){t.addEventListener(e,_(st),!1)}),c.controlsRight.forEach(function(t){t.addEventListener(e,_(ot),!1)}),c.controlsUp.forEach(function(t){t.addEventListener(e,_(ut),!1)}),c.controlsDown.forEach(function(t){t.addEventListener(e,_(at),!1)}),c.controlsPrev.forEach(function(t){t.addEventListener(e,_(ft),!1)}),c.controlsNext.forEach(function(t){t.addEventListener(e,_(lt),!1)})}}function k(){document.removeEventListener("keydown",ct,!1),document.removeEventListener("touchstart",ht,!1),document.removeEventListener("touchmove",pt,!1),document.removeEventListener("touchend",dt,!1),window.removeEventListener("hashchange",gt,!1),window.removeEventListener("resize",yt,!1),i.progress&&c.progress&&c.progress.removeEventListener("click",_(mt),!1);if(i.controls&&c.controls){var e="ontouchstart"in window?"touchstart":"click";c.controlsLeft.forEach(function(t){t.removeEventListener(e,_(st),!1)}),c.controlsRight.forEach(function(t){t.removeEventListener(e,_(ot),!1)}),c.controlsUp.forEach(function(t){t.removeEventListener(e,_(ut),!1)}),c.controlsDown.forEach(function(t){t.removeEventListener(e,_(at),!1)}),c.controlsPrev.forEach(function(t){t.removeEventListener(e,_(ft),!1)}),c.controlsNext.forEach(function(t){t.removeEventListener(e,_(lt),!1)})}}function L(e,t){for(var n in t)e[n]=t[n]}function A(e){return Array.prototype.slice.call(e)}function O(e,t,n){e.forEach(function(e){e[t].apply(e,n)})}function M(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function _(e){return function(t){t.preventDefault(),e.call(null,t)}}function D(){setTimeout(function(){window.scrollTo(0,1)},0)}function P(e,t){var n=document.createEvent("HTMLEvents",1,2);n.initEvent(e,!0,!0),L(n,t),c.wrapper.dispatchEvent(n)}function H(){if(h&&!("msPerspective"in document.body.style)){var t=document.querySelectorAll(e+" a:not(.image)");for(var n=0,r=t.length;n<r;n++){var i=t[n];if(i.textContent&&!i.querySelector("img")&&(!i.className||!i.classList.contains(i,"roll"))){var s=document.createElement("span");s.setAttribute("data-title",i.text),s.innerHTML=i.innerHTML,i.classList.add("roll"),i.innerHTML="",i.appendChild(s)}}}}function B(){if(i.center){var t=A(document.querySelectorAll(e)),n=-c.wrapper.offsetHeight/2;for(var r=0,s=t.length;r<s;r++){var o=t[r];if(o.style.display==="none")continue;o.classList.contains("stack")?o.style.top=0:o.style.top=Math.max(-(o.offsetHeight/2)-20,n)+"px"}}}function j(e,t){e&&e.setAttribute("data-previous-indexv",t||0)}function F(e){return e&&e.classList.contains("stack")?parseInt(e.getAttribute("data-previous-indexv")||0,10):0}function I(){i.overview&&(c.wrapper.classList.add("overview"),c.wrapper.classList.remove("exit-overview"),clearTimeout(g),clearTimeout(y),g=setTimeout(function(){var e=document.querySelectorAll(t);for(var n=0,r=e.length;n<r;n++){var i=e[n],s="translateZ(-2500px) translate("+(n-o)*105+"%, 0%)";i.setAttribute("data-index-h",n),i.style.display="block",i.style.WebkitTransform=s,i.style.MozTransform=s,i.style.msTransform=s,i.style.OTransform=s,i.style.transform=s;if(i.classList.contains("stack")){var a=i.querySelectorAll("section");for(var f=0,l=a.length;f<l;f++){var c=n===o?u:F(i),h=a[f],p="translate(0%, "+(f-c)*105+"%)";h.setAttribute("data-index-h",n),h.setAttribute("data-index-v",f),h.style.display="block",h.style.WebkitTransform=p,h.style.MozTransform=p,h.style.msTransform=p,h.style.OTransform=p,h.style.transform=p,h.addEventListener("click",bt,!0)}}else i.addEventListener("click",bt,!0)}B()},10))}function q(){if(i.overview){clearTimeout(g),clearTimeout(y),c.wrapper.classList.remove("overview"),c.wrapper.classList.add("exit-overview"),y=setTimeout(function(){c.wrapper.classList.remove("exit-overview")},10);var t=A(document.querySelectorAll(e));for(var n=0,r=t.length;n<r;n++){var s=t[n];s.style.display="",s.style.WebkitTransform="",s.style.MozTransform="",s.style.msTransform="",s.style.OTransform="",s.style.transform="",s.removeEventListener("click",bt,!0)}J(o,u)}}function R(e){typeof e=="boolean"?e?I():q():U()?q():I()}function U(){return c.wrapper.classList.contains("overview")}function z(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&t.apply(e)}function W(){c.wrapper.classList.add("paused")}function X(){c.wrapper.classList.remove("paused")}function V(){$()?X():W()}function $(){return c.wrapper.classList.contains("paused")}function J(e,i,s){a=f;var c=document.querySelectorAll(t);i===undefined&&(i=F(c[e])),a&&a.parentNode&&a.parentNode.classList.contains("stack")&&j(a.parentNode,u);var h=l.concat();l.length=0;var p=o,d=u;o=K(t,e===undefined?o:e),u=K(n,i===undefined?u:i),B();e:for(var v=0,m=l.length;v<m;v++){for(var g=0;g<h.length;g++)if(h[g]===l[v]){h.splice(g,1);continue e}document.documentElement.classList.add(l[v]),P(l[v])}while(h.length)document.documentElement.classList.remove(h.pop());U()&&I(),et(1500);var y=c[o],b=y.querySelectorAll("section");f=b[u]||y;if(typeof s!="undefined"){var w=f.querySelectorAll(".fragment");A(w).forEach(function(e,t){t<s?e.classList.add("visible"):e.classList.remove("visible")})}o!==p||u!==d?P("slidechanged",{indexh:o,indexv:u,previousSlide:a,currentSlide:f}):a=null,a&&(a.classList.remove("present"),document.querySelector(r).classList.contains("present")&&setTimeout(function(){var e=A(document.querySelectorAll(t+".stack")),n;for(n in e)e[n]&&j(e[n],0)},0)),G(),Q()}function K(e,t){var n=A(document.querySelectorAll(e)),r=n.length;if(r){i.loop&&(t%=r,t<0&&(t=r+t)),t=Math.max(Math.min(t,r-1),0);for(var o=0;o<r;o++){var u=n[o];if(U()===!1){var a=Math.abs((t-o)%(r-3))||0;u.style.display=a>3?"none":"block"}n[o].classList.remove("past"),n[o].classList.remove("present"),n[o].classList.remove("future"),o<t?n[o].classList.add("past"):o>t&&n[o].classList.add("future"),u.querySelector("section")&&n[o].classList.add("stack")}n[t].classList.add("present");var f=n[t].getAttribute("data-state");f&&(l=l.concat(f.split(" ")));var c=n[t].getAttribute("data-autoslide");c?s=parseInt(c,10):s=i.autoSlide}else t=0;return t}function Q(){if(i.progress&&c.progress){var n=A(document.querySelectorAll(t)),r=document.querySelectorAll(e+":not(.stack)").length,s=0;e:for(var o=0;o<n.length;o++){var u=n[o],a=A(u.querySelectorAll("section"));for(var f=0;f<a.length;f++){if(a[f].classList.contains("present"))break e;s++}if(u.classList.contains("present"))break;u.classList.contains("stack")===!1&&s++}c.progressbar.style.width=s/(r-1)*window.innerWidth+"px"}}function G(){if(i.controls&&c.controls){var e=Y();c.controlsLeft.concat(c.controlsRight).concat(c.controlsUp).concat(c.controlsDown).concat(c.controlsPrev).concat(c.controlsNext).forEach(function(e){e.classList.remove("enabled")}),e.left&&c.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&c.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&c.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&c.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&c.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&c.controlsNext.forEach(function(e){e.classList.add("enabled")})}}function Y(){var e=document.querySelectorAll(t),r=document.querySelectorAll(n);return{left:o>0,right:o<e.length-1,up:u>0,down:u<r.length-1}}function Z(){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 i=Reveal.getIndices(r);J(i.h,i.v)}else J(o,u)}else{var s=parseInt(t[0],10)||0,a=parseInt(t[1],10)||0;J(s,a)}}function et(e){if(i.history){clearTimeout(m);if(typeof e=="number")m=setTimeout(et,e);else{var t="/";if(f&&typeof f.getAttribute("id")=="string")t="/"+f.getAttribute("id");else{if(o>0||u>0)t+=o;u>0&&(t+="/"+u)}window.location.hash=t}}}function tt(e){var n=o,r=u;if(e){var i=!!e.parentNode.nodeName.match(/section/gi),s=i?e.parentNode:e,a=A(document.querySelectorAll(t));n=Math.max(a.indexOf(s),0),i&&(r=Math.max(A(e.parentNode.querySelectorAll("section")).indexOf(e),0))}return{h:n,v:r}}function nt(){if(document.querySelector(n+".present")){var e=document.querySelectorAll(n+".present .fragment:not(.visible)");if(e.length)return e[0].classList.add("visible"),P("fragmentshown",{fragment:e[0]}),!0}else{var r=document.querySelectorAll(t+".present .fragment:not(.visible)");if(r.length)return r[0].classList.add("visible"),P("fragmentshown",{fragment:r[0]}),!0}return!1}function rt(){if(document.querySelector(n+".present")){var e=document.querySelectorAll(n+".present .fragment.visible");if(e.length)return e[e.length-1].classList.remove("visible"),P("fragmenthidden",{fragment:e[e.length-1]}),!0}else{var r=document.querySelectorAll(t+".present .fragment.visible");if(r.length)return r[r.length-1].classList.remove("visible"),P("fragmenthidden",{fragment:r[r.length-1]}),!0}return!1}function it(){clearTimeout(v),s&&(v=setTimeout(lt,s))}function st(){(Y().left&&U()||rt()===!1)&&J(o-1)}function ot(){(Y().right&&U()||nt()===!1)&&J(o+1)}function ut(){(Y().up&&U()||rt()===!1)&&J(o,u-1)}function at(){(Y().down&&U()||nt()===!1)&&J(o,u+1)}function ft(){if(rt()===!1)if(Y().up)ut();else{var e=document.querySelector(t+".past:nth-child("+o+")");e&&(u=e.querySelectorAll("section").length+1||undefined,o--,J())}}function lt(){nt()===!1&&(Y().down?at():ot()),it()}function ct(e){var t=document.activeElement,n=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&document.activeElement.contentEditable==="inherit");if(n||e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)return;var r=!0;switch(e.keyCode){case 80:case 33:ft();break;case 78:case 34:lt();break;case 72:case 37:st();break;case 76:case 39:ot();break;case 75:case 38:ut();break;case 74:case 40:at();break;case 36:J(0);break;case 35:J(Number.MAX_VALUE);break;case 32:U()?q():lt();break;case 13:U()?q():r=!1;break;case 66:case 190:V();break;case 70:z();break;default:r=!1}r?e.preventDefault():e.keyCode===27&&h&&(R(),e.preventDefault()),it()}function ht(e){b.startX=e.touches[0].clientX,b.startY=e.touches[0].clientY,b.startCount=e.touches.length,e.touches.length===2&&i.overview&&(b.startSpan=M({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:b.startX,y:b.startY}))}function pt(e){if(!b.handled){var t=e.touches[0].clientX,n=e.touches[0].clientY;if(e.touches.length===2&&b.startCount===2&&i.overview){var r=M({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:b.startX,y:b.startY});Math.abs(b.startSpan-r)>b.threshold&&(b.handled=!0,r<b.startSpan?I():q()),e.preventDefault()}else if(e.touches.length===1&&b.startCount!==2){var s=t-b.startX,o=n-b.startY;s>b.threshold&&Math.abs(s)>Math.abs(o)?(b.handled=!0,st()):s<-b.threshold&&Math.abs(s)>Math.abs(o)?(b.handled=!0,ot()):o>b.threshold?(b.handled=!0,ut()):o<-b.threshold&&(b.handled=!0,at()),e.preventDefault()}}else navigator.userAgent.match(/android/gi)&&e.preventDefault()}function dt(e){b.handled=!1}function vt(e){clearTimeout(d),d=setTimeout(function(){var t=e.detail||-e.wheelDelta;t>0?lt():ft()},100)}function mt(e){var n=A(document.querySelectorAll(t)).length,r=Math.floor(e.clientX/c.wrapper.offsetWidth*n);J(r)}function gt(e){Z()}function yt(e){B()}function bt(e){if(U()){e.preventDefault(),q();var t=e.target;while(t&&!t.nodeName.match(/section/gi))t=t.parentNode;if(t.nodeName.match(/section/gi)){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);J(n,r)}}}var e=".reveal .slides section",t=".reveal .slides>section",n=".reveal .slides>section.present>section",r=".reveal .slides>section:first-child",i={controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,loop:!1,rtl:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!0,theme:null,transition:"default",dependencies:[]},s=i.autoSlide,o=0,u=0,a,f,l=[],c={},h="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,p="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,d=0,v=0,m=0,g=0,y=0,b={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:w,slide:J,left:st,right:ot,up:ut,down:at,prev:ft,next:lt,prevFragment:rt,nextFragment:nt,navigateTo:J,navigateLeft:st,navigateRight:ot,navigateUp:ut,navigateDown:at,navigatePrev:ft,navigateNext:lt,toggleOverview:R,addEventListeners:C,removeEventListeners:k,getIndices:tt,getPreviousSlide:function(){return a},getCurrentSlide:function(){return f},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},addEventListener:function(e,t,n){"addEventListener"in window&&(c.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&(c.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}();
\ No newline at end of file
+var Reveal=function(){"use strict";function u(a){return n||m?(window.addEventListener("load",J,!1),C(e,a),w(),x(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function v(){if(l.theme=document.querySelector("#theme"),l.wrapper=document.querySelector(".reveal"),l.slides=document.querySelector(".reveal .slides"),!l.wrapper.querySelector(".progress")&&e.progress){var a=document.createElement("div");a.classList.add("progress"),a.innerHTML="<span></span>",l.wrapper.appendChild(a)}if(!l.wrapper.querySelector(".controls")&&e.controls){var b=document.createElement("aside");b.classList.add("controls"),b.innerHTML='<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>',l.wrapper.appendChild(b)}if(!l.wrapper.querySelector(".state-background")){var c=document.createElement("div");c.classList.add("state-background"),l.wrapper.appendChild(c)}if(!l.wrapper.querySelector(".pause-overlay")){var d=document.createElement("div");d.classList.add("pause-overlay"),l.wrapper.appendChild(d)}l.progress=document.querySelector(".reveal .progress"),l.progressbar=document.querySelector(".reveal .progress span"),e.controls&&(l.controls=document.querySelector(".reveal .controls"),l.controlsLeft=D(document.querySelectorAll(".navigate-left")),l.controlsRight=D(document.querySelectorAll(".navigate-right")),l.controlsUp=D(document.querySelectorAll(".navigate-up")),l.controlsDown=D(document.querySelectorAll(".navigate-down")),l.controlsPrev=D(document.querySelectorAll(".navigate-prev")),l.controlsNext=D(document.querySelectorAll(".navigate-next")))}function w(){navigator.userAgent.match(/(iphone|ipod)/i)&&(document.documentElement.style.overflow="scroll",document.body.style.height="120%",window.addEventListener("load",G,!1),window.addEventListener("orientationchange",G,!1))}function x(){function g(){b.length&&head.js.apply(null,b),y()}for(var a=[],b=[],c=0,d=e.dependencies.length;d>c;c++){var f=e.dependencies[c];(!f.condition||f.condition())&&(f.async?b.push(f.src):a.push(f.src),"function"==typeof f.callback&&head.ready(f.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],f.callback))}a.length?(head.ready(g),head.js.apply(null,a)):g()}function y(){v(),A(),z(),J(),$(),db(),setTimeout(function(){H("ready",{indexh:g,indexv:h,currentSlide:j})},1)}function z(){if(m===!1&&(e.transition="linear"),e.controls&&l.controls&&(l.controls.style.display="block"),e.progress&&l.progress&&(l.progress.style.display="block"),"default"!==e.transition&&l.wrapper.classList.add(e.transition),e.rtl&&l.wrapper.classList.add("rtl"),e.center&&l.wrapper.classList.add("center"),e.mouseWheel&&(document.addEventListener("DOMMouseScroll",ob,!1),document.addEventListener("mousewheel",ob,!1)),e.rollingLinks&&I(),e.theme&&l.theme){var a=l.theme.getAttribute("href"),b=/[^\/]*?(?=\.css)/,c=a.match(b)[0];e.theme!==c&&(a=a.replace(b,e.theme),l.theme.setAttribute("href",a))}}function A(){if(document.addEventListener("touchstart",lb,!1),document.addEventListener("touchmove",mb,!1),document.addEventListener("touchend",nb,!1),window.addEventListener("hashchange",qb,!1),window.addEventListener("resize",rb,!1),e.keyboard&&document.addEventListener("keydown",kb,!1),e.progress&&l.progress&&l.progress.addEventListener("click",F(pb),!1),e.controls&&l.controls){var a="ontouchstart"in window?"touchstart":"click";l.controlsLeft.forEach(function(b){b.addEventListener(a,F(eb),!1)}),l.controlsRight.forEach(function(b){b.addEventListener(a,F(fb),!1)}),l.controlsUp.forEach(function(b){b.addEventListener(a,F(gb),!1)}),l.controlsDown.forEach(function(b){b.addEventListener(a,F(hb),!1)}),l.controlsPrev.forEach(function(b){b.addEventListener(a,F(ib),!1)}),l.controlsNext.forEach(function(b){b.addEventListener(a,F(jb),!1)})}}function B(){if(document.removeEventListener("keydown",kb,!1),document.removeEventListener("touchstart",lb,!1),document.removeEventListener("touchmove",mb,!1),document.removeEventListener("touchend",nb,!1),window.removeEventListener("hashchange",qb,!1),window.removeEventListener("resize",rb,!1),e.progress&&l.progress&&l.progress.removeEventListener("click",F(pb),!1),e.controls&&l.controls){var a="ontouchstart"in window?"touchstart":"click";l.controlsLeft.forEach(function(b){b.removeEventListener(a,F(eb),!1)}),l.controlsRight.forEach(function(b){b.removeEventListener(a,F(fb),!1)}),l.controlsUp.forEach(function(b){b.removeEventListener(a,F(gb),!1)}),l.controlsDown.forEach(function(b){b.removeEventListener(a,F(hb),!1)}),l.controlsPrev.forEach(function(b){b.removeEventListener(a,F(ib),!1)}),l.controlsNext.forEach(function(b){b.removeEventListener(a,F(jb),!1)})}}function C(a,b){for(var c in b)a[c]=b[c]}function D(a){return Array.prototype.slice.call(a)}function E(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function F(a){return function(b){b.preventDefault(),a.call(null,b)}}function G(){setTimeout(function(){window.scrollTo(0,1)},0)}function H(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),C(c,b),l.wrapper.dispatchEvent(c)}function I(){if(m&&!("msPerspective"in document.body.style))for(var b=document.querySelectorAll(a+" a:not(.image)"),c=0,d=b.length;d>c;c++){var e=b[c];if(!(!e.textContent||e.querySelector("img")||e.className&&e.classList.contains(e,"roll"))){var f=document.createElement("span");f.setAttribute("data-title",e.text),f.innerHTML=e.innerHTML,e.classList.add("roll"),e.innerHTML="",e.appendChild(f)}}}function J(){if(e.center)for(var b=D(document.querySelectorAll(a)),c=-l.wrapper.offsetHeight/2,d=0,f=b.length;f>d;d++){var g=b[d];"none"!==g.style.display&&(g.style.top=g.classList.contains("stack")?0:Math.max(-(g.offsetHeight/2)-20,c)+"px")}}function K(a,b){a&&a.setAttribute("data-previous-indexv",b||0)}function L(a){return a&&a.classList.contains("stack")?parseInt(a.getAttribute("data-previous-indexv")||0,10):0}function M(){e.overview&&(l.wrapper.classList.add("overview"),l.wrapper.classList.remove("exit-overview"),clearTimeout(r),clearTimeout(s),r=setTimeout(function(){for(var a=document.querySelectorAll(b),c=0,d=a.length;d>c;c++){var e=a[c],f="translateZ(-2500px) translate("+105*(c-g)+"%, 0%)";if(e.setAttribute("data-index-h",c),e.style.display="block",e.style.WebkitTransform=f,e.style.MozTransform=f,e.style.msTransform=f,e.style.OTransform=f,e.style.transform=f,e.classList.contains("stack"))for(var i=e.querySelectorAll("section"),j=0,k=i.length;k>j;j++){var l=c===g?h:L(e),m=i[j],n="translate(0%, "+105*(j-l)+"%)";m.setAttribute("data-index-h",c),m.setAttribute("data-index-v",j),m.style.display="block",m.style.WebkitTransform=n,m.style.MozTransform=n,m.style.msTransform=n,m.style.OTransform=n,m.style.transform=n,m.addEventListener("click",sb,!0)}else e.addEventListener("click",sb,!0)}J()},10))}function N(){if(e.overview){clearTimeout(r),clearTimeout(s),l.wrapper.classList.remove("overview"),l.wrapper.classList.add("exit-overview"),s=setTimeout(function(){l.wrapper.classList.remove("exit-overview")},10);for(var b=D(document.querySelectorAll(a)),c=0,d=b.length;d>c;c++){var f=b[c];f.style.display="",f.style.WebkitTransform="",f.style.MozTransform="",f.style.msTransform="",f.style.OTransform="",f.style.transform="",f.removeEventListener("click",sb,!0)}V(g,h)}}function O(a){"boolean"==typeof a?a?M():N():P()?N():M()}function P(){return l.wrapper.classList.contains("overview")}function Q(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function R(){l.wrapper.classList.add("paused")}function S(){l.wrapper.classList.remove("paused")}function T(){U()?S():R()}function U(){return l.wrapper.classList.contains("paused")}function V(a,e,f){i=j;var l=document.querySelectorAll(b);void 0===e&&(e=L(l[a])),i&&i.parentNode&&i.parentNode.classList.contains("stack")&&K(i.parentNode,h);var m=k.concat();k.length=0;var n=g,o=h;g=W(b,void 0===a?g:a),h=W(c,void 0===e?h:e),J();a:for(var p=0,q=k.length;q>p;p++){for(var r=0;m.length>r;r++)if(m[r]===k[p]){m.splice(r,1);continue a}document.documentElement.classList.add(k[p]),H(k[p])}for(;m.length;)document.documentElement.classList.remove(m.pop());P()&&M(),_(1500);var s=l[g],t=s.querySelectorAll("section");if(j=t[h]||s,f!==void 0){var u=j.querySelectorAll(".fragment");D(u).forEach(function(a,b){f>b?a.classList.add("visible"):a.classList.remove("visible")})}g!==n||h!==o?H("slidechanged",{indexh:g,indexv:h,previousSlide:i,currentSlide:j}):i=null,i&&(i.classList.remove("present"),document.querySelector(d).classList.contains("present")&&setTimeout(function(){var c,a=D(document.querySelectorAll(b+".stack"));for(c in a)a[c]&&K(a[c],0)},0)),Y(),X()}function W(a,b){var c=D(document.querySelectorAll(a)),d=c.length;if(d){e.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var g=0;d>g;g++){var h=c[g];if(P()===!1){var i=Math.abs((b-g)%(d-3))||0;h.style.display=i>3?"none":"block"}c[g].classList.remove("past"),c[g].classList.remove("present"),c[g].classList.remove("future"),b>g?c[g].classList.add("past"):g>b&&c[g].classList.add("future"),h.querySelector("section")&&c[g].classList.add("stack")}c[b].classList.add("present");var j=c[b].getAttribute("data-state");j&&(k=k.concat(j.split(" ")));var l=c[b].getAttribute("data-autoslide");f=l?parseInt(l,10):e.autoSlide}else b=0;return b}function X(){if(e.progress&&l.progress){var c=D(document.querySelectorAll(b)),d=document.querySelectorAll(a+":not(.stack)").length,f=0;a:for(var g=0;c.length>g;g++){for(var h=c[g],i=D(h.querySelectorAll("section")),j=0;i.length>j;j++){if(i[j].classList.contains("present"))break a;f++}if(h.classList.contains("present"))break;h.classList.contains("stack")===!1&&f++}l.progressbar.style.width=f/(d-1)*window.innerWidth+"px"}}function Y(){if(e.controls&&l.controls){var a=Z();l.controlsLeft.concat(l.controlsRight).concat(l.controlsUp).concat(l.controlsDown).concat(l.controlsPrev).concat(l.controlsNext).forEach(function(a){a.classList.remove("enabled")}),a.left&&l.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&l.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&l.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&l.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&l.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&l.controlsNext.forEach(function(a){a.classList.add("enabled")})}}function Z(){var a=document.querySelectorAll(b),d=document.querySelectorAll(c);return{left:g>0,right:a.length-1>g,up:h>0,down:d.length-1>h}}function $(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);V(e.h,e.v)}else V(g,h)}else{var f=parseInt(b[0],10)||0,i=parseInt(b[1],10)||0;V(f,i)}}function _(a){if(e.history)if(clearTimeout(q),"number"==typeof a)q=setTimeout(_,a);else{var b="/";j&&"string"==typeof j.getAttribute("id")?b="/"+j.getAttribute("id"):((g>0||h>0)&&(b+=g),h>0&&(b+="/"+h)),window.location.hash=b}}function ab(a){var c=g,d=h;if(a){var e=!!a.parentNode.nodeName.match(/section/gi),f=e?a.parentNode:a,i=D(document.querySelectorAll(b));c=Math.max(i.indexOf(f),0),e&&(d=Math.max(D(a.parentNode.querySelectorAll("section")).indexOf(a),0))}return{h:c,v:d}}function bb(){if(document.querySelector(c+".present")){var a=document.querySelectorAll(c+".present .fragment:not(.visible)");if(a.length)return a[0].classList.add("visible"),H("fragmentshown",{fragment:a[0]}),!0}else{var d=document.querySelectorAll(b+".present .fragment:not(.visible)");if(d.length)return d[0].classList.add("visible"),H("fragmentshown",{fragment:d[0]}),!0}return!1}function cb(){if(document.querySelector(c+".present")){var a=document.querySelectorAll(c+".present .fragment.visible");if(a.length)return a[a.length-1].classList.remove("visible"),H("fragmenthidden",{fragment:a[a.length-1]}),!0}else{var d=document.querySelectorAll(b+".present .fragment.visible");if(d.length)return d[d.length-1].classList.remove("visible"),H("fragmenthidden",{fragment:d[d.length-1]}),!0}return!1}function db(){clearTimeout(p),f&&(p=setTimeout(jb,f))}function eb(){(Z().left&&P()||cb()===!1)&&V(g-1)}function fb(){(Z().right&&P()||bb()===!1)&&V(g+1)}function gb(){(Z().up&&P()||cb()===!1)&&V(g,h-1)}function hb(){(Z().down&&P()||bb()===!1)&&V(g,h+1)}function ib(){if(cb()===!1)if(Z().up)gb();else{var a=document.querySelector(b+".past:nth-child("+g+")");a&&(h=a.querySelectorAll("section").length+1||void 0,g--,V())}}function jb(){bb()===!1&&(Z().down?hb():fb()),db()}function kb(a){document.activeElement;var c=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(c||a.shiftKey||a.altKey||a.ctrlKey||a.metaKey)){var d=!0;switch(a.keyCode){case 80:case 33:ib();break;case 78:case 34:jb();break;case 72:case 37:eb();break;case 76:case 39:fb();break;case 75:case 38:gb();break;case 74:case 40:hb();break;case 36:V(0);break;case 35:V(Number.MAX_VALUE);break;case 32:P()?N():jb();break;case 13:P()?N():d=!1;break;case 66:case 190:case 191:T();break;case 70:Q();break;default:d=!1}d?a.preventDefault():27===a.keyCode&&m&&(O(),a.preventDefault()),db()}}function lb(a){t.startX=a.touches[0].clientX,t.startY=a.touches[0].clientY,t.startCount=a.touches.length,2===a.touches.length&&e.overview&&(t.startSpan=E({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:t.startX,y:t.startY}))}function mb(a){if(t.handled)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===t.startCount&&e.overview){var d=E({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:t.startX,y:t.startY});Math.abs(t.startSpan-d)>t.threshold&&(t.handled=!0,t.startSpan>d?M():N()),a.preventDefault()}else if(1===a.touches.length&&2!==t.startCount){var f=b-t.startX,g=c-t.startY;f>t.threshold&&Math.abs(f)>Math.abs(g)?(t.handled=!0,eb()):-t.threshold>f&&Math.abs(f)>Math.abs(g)?(t.handled=!0,fb()):g>t.threshold?(t.handled=!0,gb()):-t.threshold>g&&(t.handled=!0,hb()),a.preventDefault()}}}function nb(){t.handled=!1}function ob(a){clearTimeout(o),o=setTimeout(function(){var b=a.detail||-a.wheelDelta;b>0?jb():ib()},100)}function pb(a){var c=D(document.querySelectorAll(b)).length,d=Math.floor(a.clientX/l.wrapper.offsetWidth*c);V(d)}function qb(){$()}function rb(){J()}function sb(a){if(P()){a.preventDefault(),N();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b.nodeName.match(/section/gi)){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);V(c,d)}}}var i,j,a=".reveal .slides section",b=".reveal .slides>section",c=".reveal .slides>section.present>section",d=".reveal .slides>section:first-child",e={controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,loop:!1,rtl:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!0,theme:null,transition:"default",dependencies:[]},f=e.autoSlide,g=0,h=0,k=[],l={},m="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,n="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,o=0,p=0,q=0,r=0,s=0,t={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:u,slide:V,left:eb,right:fb,up:gb,down:hb,prev:ib,next:jb,prevFragment:cb,nextFragment:bb,navigateTo:V,navigateLeft:eb,navigateRight:fb,navigateUp:gb,navigateDown:hb,navigatePrev:ib,navigateNext:jb,layout:J,toggleOverview:O,togglePause:T,addEventListeners:A,removeEventListeners:B,getIndices:ab,getPreviousSlide:function(){return i},getCurrentSlide:function(){return j},getQueryHash:function(){var a={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()}),a},addEventListener:function(a,b,c){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file