).';\n\n\t\tif( initialized ) throw 'Reveal.js has already been initialized.';\n\n\t\tinitialized = true;\n\n\t\t// Cache references to key DOM elements\n\t\tdom.wrapper = revealElement;\n\t\tdom.slides = revealElement.querySelector( '.slides' );\n\n\t\tif( !dom.slides ) throw 'Unable to find slides container (
).';\n\n\t\t// Compose our config object in order of increasing precedence:\n\t\t// 1. Default reveal.js options\n\t\t// 2. Options provided via Reveal.configure() prior to\n\t\t// initialization\n\t\t// 3. Options passed to the Reveal constructor\n\t\t// 4. Options passed to Reveal.initialize\n\t\t// 5. Query params\n\t\tconfig = { ...defaultConfig, ...config, ...options, ...initOptions, ...Util.getQueryHash() };\n\n\t\t// Legacy support for the ?print-pdf query\n\t\tif( /print-pdf/gi.test( window.location.search ) ) {\n\t\t\tconfig.view = 'print';\n\t\t}\n\n\t\tsetViewport();\n\n\t\t// Force a layout when the whole page, incl fonts, has loaded\n\t\twindow.addEventListener( 'load', layout, false );\n\n\t\t// Register plugins and load dependencies, then move on to #start()\n\t\tplugins.load( config.plugins, config.dependencies ).then( start );\n\n\t\treturn new Promise( resolve => Reveal.on( 'ready', resolve ) );\n\n\t}\n\n\t/**\n\t * Encase the presentation in a reveal.js viewport. The\n\t * extent of the viewport differs based on configuration.\n\t */\n\tfunction setViewport() {\n\n\t\t// Embedded decks use the reveal element as their viewport\n\t\tif( config.embedded === true ) {\n\t\t\tdom.viewport = Util.closest( revealElement, '.reveal-viewport' ) || revealElement;\n\t\t}\n\t\t// Full-page decks use the body as their viewport\n\t\telse {\n\t\t\tdom.viewport = document.body;\n\t\t\tdocument.documentElement.classList.add( 'reveal-full-page' );\n\t\t}\n\n\t\tdom.viewport.classList.add( 'reveal-viewport' );\n\n\t}\n\n\t/**\n\t * Starts up reveal.js by binding input events and navigating\n\t * to the current URL deeplink if there is one.\n\t */\n\tfunction start() {\n\n\t\t// Don't proceed if this instance has been destroyed\n\t\tif( initialized === false ) return;\n\n\t\tready = true;\n\n\t\t// Remove slides hidden with data-visibility\n\t\tremoveHiddenSlides();\n\n\t\t// Make sure we've got all the DOM elements we need\n\t\tsetupDOM();\n\n\t\t// Listen to messages posted to this window\n\t\tsetupPostMessage();\n\n\t\t// Prevent the slides from being scrolled out of view\n\t\tsetupScrollPrevention();\n\n\t\t// Adds bindings for fullscreen mode\n\t\tsetupFullscreen();\n\n\t\t// Resets all vertical slides so that only the first is visible\n\t\tresetVerticalSlides();\n\n\t\t// Updates the presentation to match the current configuration values\n\t\tconfigure();\n\n\t\t// Create slide backgrounds\n\t\tbackgrounds.update( true );\n\n\t\t// Activate the print/scroll view if configured\n\t\tactivateInitialView();\n\n\t\t// Read the initial hash\n\t\tlocation.readURL();\n\n\t\t// Notify listeners that the presentation is ready but use a 1ms\n\t\t// timeout to ensure it's not fired synchronously after #initialize()\n\t\tsetTimeout( () => {\n\t\t\t// Enable transitions now that we're loaded\n\t\t\tdom.slides.classList.remove( 'no-transition' );\n\n\t\t\tdom.wrapper.classList.add( 'ready' );\n\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'ready',\n\t\t\t\tdata: {\n\t\t\t\t\tindexh,\n\t\t\t\t\tindexv,\n\t\t\t\t\tcurrentSlide\n\t\t\t\t}\n\t\t\t});\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Activates the correct reveal.js view based on our config.\n\t * This is only invoked once during initialization.\n\t */\n\tfunction activateInitialView() {\n\n\t\tconst activatePrintView = config.view === 'print';\n\t\tconst activateScrollView = config.view === 'scroll' || config.view === 'reader';\n\n\t\tif( activatePrintView || activateScrollView ) {\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\tremoveEventListeners();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttouch.unbind();\n\t\t\t}\n\n\t\t\t// Avoid content flickering during layout\n\t\t\tdom.viewport.classList.add( 'loading-scroll-mode' );\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\t// The document needs to have loaded for the PDF layout\n\t\t\t\t// measurements to be accurate\n\t\t\t\tif( document.readyState === 'complete' ) {\n\t\t\t\t\tprintView.activate();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twindow.addEventListener( 'load', () => printView.activate() );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscrollView.activate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes all slides with data-visibility=\"hidden\". This\n\t * is done right before the rest of the presentation is\n\t * initialized.\n\t *\n\t * If you want to show all hidden slides, initialize\n\t * reveal.js with showHiddenSlides set to true.\n\t */\n\tfunction removeHiddenSlides() {\n\n\t\tif( !config.showHiddenSlides ) {\n\t\t\tUtil.queryAll( dom.wrapper, 'section[data-visibility=\"hidden\"]' ).forEach( slide => {\n\t\t\t\tconst parent = slide.parentNode;\n\n\t\t\t\t// If this slide is part of a stack and that stack will be\n\t\t\t\t// empty after removing the hidden slide, remove the entire\n\t\t\t\t// stack\n\t\t\t\tif( parent.childElementCount === 1 && /section/i.test( parent.nodeName ) ) {\n\t\t\t\t\tparent.remove();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslide.remove();\n\t\t\t\t}\n\n\t\t\t} );\n\t\t}\n\n\t}\n\n\t/**\n\t * Finds and stores references to DOM elements which are\n\t * required by the presentation. If a required element is\n\t * not found, it is created.\n\t */\n\tfunction setupDOM() {\n\n\t\t// Prevent transitions while we're loading\n\t\tdom.slides.classList.add( 'no-transition' );\n\n\t\tif( Device.isMobile ) {\n\t\t\tdom.wrapper.classList.add( 'no-hover' );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.classList.remove( 'no-hover' );\n\t\t}\n\n\t\tbackgrounds.render();\n\t\tslideNumber.render();\n\t\tjumpToSlide.render();\n\t\tcontrols.render();\n\t\tprogress.render();\n\t\tnotes.render();\n\n\t\t// Overlay graphic which is displayed during the paused mode\n\t\tdom.pauseOverlay = Util.createSingletonNode( dom.wrapper, 'div', 'pause-overlay', config.controls ? '
Resume presentation ' : null );\n\n\t\tdom.statusElement = createStatusElement();\n\n\t\tdom.wrapper.setAttribute( 'role', 'application' );\n\t}\n\n\t/**\n\t * Creates a hidden div with role aria-live to announce the\n\t * current slide content. Hide the div off-screen to make it\n\t * available only to Assistive Technologies.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction createStatusElement() {\n\n\t\tlet statusElement = dom.wrapper.querySelector( '.aria-status' );\n\t\tif( !statusElement ) {\n\t\t\tstatusElement = document.createElement( 'div' );\n\t\t\tstatusElement.style.position = 'absolute';\n\t\t\tstatusElement.style.height = '1px';\n\t\t\tstatusElement.style.width = '1px';\n\t\t\tstatusElement.style.overflow = 'hidden';\n\t\t\tstatusElement.style.clip = 'rect( 1px, 1px, 1px, 1px )';\n\t\t\tstatusElement.classList.add( 'aria-status' );\n\t\t\tstatusElement.setAttribute( 'aria-live', 'polite' );\n\t\t\tstatusElement.setAttribute( 'aria-atomic','true' );\n\t\t\tdom.wrapper.appendChild( statusElement );\n\t\t}\n\t\treturn statusElement;\n\n\t}\n\n\t/**\n\t * Announces the given text to screen readers.\n\t */\n\tfunction announceStatus( value ) {\n\n\t\tdom.statusElement.textContent = value;\n\n\t}\n\n\t/**\n\t * Converts the given HTML element into a string of text\n\t * that can be announced to a screen reader. Hidden\n\t * elements are excluded.\n\t */\n\tfunction getStatusText( node ) {\n\n\t\tlet text = '';\n\n\t\t// Text node\n\t\tif( node.nodeType === 3 ) {\n\t\t\ttext += node.textContent.trim();\n\t\t}\n\t\t// Element node\n\t\telse if( node.nodeType === 1 ) {\n\n\t\t\tlet isAriaHidden = node.getAttribute( 'aria-hidden' );\n\t\t\tlet isDisplayHidden = window.getComputedStyle( node )['display'] === 'none';\n\t\t\tif( isAriaHidden !== 'true' && !isDisplayHidden ) {\n\n\t\t\t\t// Capture alt text from img and video elements\n\t\t\t\tif( node.tagName === 'IMG' || node.tagName === 'VIDEO' ) {\n\t\t\t\t\tlet altText = node.getAttribute( 'alt' );\n\t\t\t\t\tif( altText ) {\n\t\t\t\t\t\ttext += ensurePunctuation( altText );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( node.childNodes ).forEach( child => {\n\t\t\t\t\ttext += getStatusText( child );\n\t\t\t\t} );\n\n\t\t\t\t// Add period after block-level text elements to improve\n\t\t\t\t// screen reader experience\n\t\t\t\tconst textElements = ['P', 'DIV', 'UL', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'BLOCKQUOTE'];\n\t\t\t\tif( textElements.includes( node.tagName ) && text.trim() !== '' ) {\n\t\t\t\t\ttext = ensurePunctuation( text );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttext = text.trim();\n\n\t\treturn text === '' ? '' : text + ' ';\n\n\t}\n\n\t/**\n\t * Ensures text ends with proper punctuation by adding a period\n\t * if it doesn't already end with punctuation.\n\t */\n\tfunction ensurePunctuation( text ) {\n\n\t\tconst trimmedText = text.trim();\n\n\t\tif( trimmedText === '' ) {\n\t\t\treturn text;\n\t\t}\n\n\t\treturn !/[.!?]$/.test(trimmedText) ? trimmedText + '.' : trimmedText;\n\n\t}\n\n\t/**\n\t * This is an unfortunate necessity. Some actions – such as\n\t * an input field being focused in an iframe or using the\n\t * keyboard to expand text selection beyond the bounds of\n\t * a slide – can trigger our content to be pushed out of view.\n\t * This scrolling can not be prevented by hiding overflow in\n\t * CSS (we already do) so we have to resort to repeatedly\n\t * checking if the slides have been offset :(\n\t */\n\tfunction setupScrollPrevention() {\n\n\t\tsetInterval( () => {\n\t\t\tif( !scrollView.isActive() && dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) {\n\t\t\t\tdom.wrapper.scrollTop = 0;\n\t\t\t\tdom.wrapper.scrollLeft = 0;\n\t\t\t}\n\t\t}, 1000 );\n\n\t}\n\n\t/**\n\t * After entering fullscreen we need to force a layout to\n\t * get our presentations to scale correctly. This behavior\n\t * is inconsistent across browsers but a force layout seems\n\t * to normalize it.\n\t */\n\tfunction setupFullscreen() {\n\n\t\tdocument.addEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.addEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\n\t}\n\n\t/**\n\t * Registers a listener to postMessage events, this makes it\n\t * possible to call all reveal.js API methods from another\n\t * window. For example:\n\t *\n\t * revealWindow.postMessage( JSON.stringify({\n\t * method: 'slide',\n\t * args: [ 2 ]\n\t * }), '*' );\n\t */\n\tfunction setupPostMessage() {\n\n\t\tif( config.postMessage ) {\n\t\t\twindow.addEventListener( 'message', onPostMessage, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the configuration settings from the config\n\t * object. May be called multiple times.\n\t *\n\t * @param {object} options\n\t */\n\tfunction configure( options ) {\n\n\t\tconst oldConfig = { ...config }\n\n\t\t// New config options may be passed when this method\n\t\t// is invoked through the API after initialization\n\t\tif( typeof options === 'object' ) Util.extend( config, options );\n\n\t\t// Abort if reveal.js hasn't finished loading, config\n\t\t// changes will be applied automatically once ready\n\t\tif( Reveal.isReady() === false ) return;\n\n\t\tconst numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length;\n\n\t\t// The transition is added as a class on the .reveal element\n\t\tdom.wrapper.classList.remove( oldConfig.transition );\n\t\tdom.wrapper.classList.add( config.transition );\n\n\t\tdom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );\n\t\tdom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );\n\n\t\t// Expose our configured slide dimensions as custom props\n\t\tdom.viewport.style.setProperty( '--slide-width', typeof config.width === 'string' ? config.width : config.width + 'px' );\n\t\tdom.viewport.style.setProperty( '--slide-height', typeof config.height === 'string' ? config.height : config.height + 'px' );\n\n\t\tif( config.shuffle ) {\n\t\t\tshuffle();\n\t\t}\n\n\t\tUtil.toggleClass( dom.wrapper, 'embedded', config.embedded );\n\t\tUtil.toggleClass( dom.wrapper, 'rtl', config.rtl );\n\t\tUtil.toggleClass( dom.wrapper, 'center', config.center );\n\n\t\t// Exit the paused mode if it was configured off\n\t\tif( config.pause === false ) {\n\t\t\tresume();\n\t\t}\n\n\t\t// Reset all changes made by auto-animations\n\t\tautoAnimate.reset();\n\n\t\t// Remove existing auto-slide controls\n\t\tif( autoSlidePlayer ) {\n\t\t\tautoSlidePlayer.destroy();\n\t\t\tautoSlidePlayer = null;\n\t\t}\n\n\t\t// Generate auto-slide controls if needed\n\t\tif( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable ) {\n\t\t\tautoSlidePlayer = new Playback( dom.wrapper, () => {\n\t\t\t\treturn Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );\n\t\t\t} );\n\n\t\t\tautoSlidePlayer.on( 'click', onAutoSlidePlayerClick );\n\t\t\tautoSlidePaused = false;\n\t\t}\n\n\t\t// Add the navigation mode to the DOM so we can adjust styling\n\t\tif( config.navigationMode !== 'default' ) {\n\t\t\tdom.wrapper.setAttribute( 'data-navigation-mode', config.navigationMode );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.removeAttribute( 'data-navigation-mode' );\n\t\t}\n\n\t\tnotes.configure( config, oldConfig );\n\t\tfocus.configure( config, oldConfig );\n\t\tpointer.configure( config, oldConfig );\n\t\tcontrols.configure( config, oldConfig );\n\t\tprogress.configure( config, oldConfig );\n\t\tkeyboard.configure( config, oldConfig );\n\t\tfragments.configure( config, oldConfig );\n\t\tslideNumber.configure( config, oldConfig );\n\n\t\tsync();\n\n\t}\n\n\t/**\n\t * Binds all event listeners.\n\t */\n\tfunction addEventListeners() {\n\n\t\teventsAreBound = true;\n\n\t\twindow.addEventListener( 'resize', onWindowResize, false );\n\n\t\tif( config.touch ) touch.bind();\n\t\tif( config.keyboard ) keyboard.bind();\n\t\tif( config.progress ) progress.bind();\n\t\tif( config.respondToHashChanges ) location.bind();\n\t\tcontrols.bind();\n\t\tfocus.bind();\n\n\t\tdom.slides.addEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.addEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.addEventListener( 'click', resume, false );\n\n\t\tif( config.focusBodyOnPageVisibilityChange ) {\n\t\t\tdocument.addEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Unbinds all event listeners.\n\t */\n\tfunction removeEventListeners() {\n\n\t\teventsAreBound = false;\n\n\t\ttouch.unbind();\n\t\tfocus.unbind();\n\t\tkeyboard.unbind();\n\t\tcontrols.unbind();\n\t\tprogress.unbind();\n\t\tlocation.unbind();\n\n\t\twindow.removeEventListener( 'resize', onWindowResize, false );\n\n\t\tdom.slides.removeEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.removeEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.removeEventListener( 'click', resume, false );\n\n\t}\n\n\t/**\n\t * Uninitializes reveal.js by undoing changes made to the\n\t * DOM and removing all event listeners.\n\t */\n\tfunction destroy() {\n\n\t\tinitialized = false;\n\n\t\t// There's nothing to destroy if this instance hasn't finished\n\t\t// initializing\n\t\tif( ready === false ) return;\n\n\t\tremoveEventListeners();\n\t\tcancelAutoSlide();\n\n\t\t// Destroy controllers\n\t\tnotes.destroy();\n\t\tfocus.destroy();\n\t\toverlay.destroy();\n\t\tplugins.destroy();\n\t\tpointer.destroy();\n\t\tcontrols.destroy();\n\t\tprogress.destroy();\n\t\tbackgrounds.destroy();\n\t\tslideNumber.destroy();\n\t\tjumpToSlide.destroy();\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\twindow.removeEventListener( 'message', onPostMessage, false );\n\t\twindow.removeEventListener( 'load', layout, false );\n\n\t\t// Undo DOM changes\n\t\tif( dom.pauseOverlay ) dom.pauseOverlay.remove();\n\t\tif( dom.statusElement ) dom.statusElement.remove();\n\n\t\tdocument.documentElement.classList.remove( 'reveal-full-page' );\n\n\t\tdom.wrapper.classList.remove( 'ready', 'center', 'has-horizontal-slides', 'has-vertical-slides' );\n\t\tdom.wrapper.removeAttribute( 'data-transition-speed' );\n\t\tdom.wrapper.removeAttribute( 'data-background-transition' );\n\n\t\tdom.viewport.classList.remove( 'reveal-viewport' );\n\t\tdom.viewport.style.removeProperty( '--slide-width' );\n\t\tdom.viewport.style.removeProperty( '--slide-height' );\n\n\t\tdom.slides.style.removeProperty( 'width' );\n\t\tdom.slides.style.removeProperty( 'height' );\n\t\tdom.slides.style.removeProperty( 'zoom' );\n\t\tdom.slides.style.removeProperty( 'left' );\n\t\tdom.slides.style.removeProperty( 'top' );\n\t\tdom.slides.style.removeProperty( 'bottom' );\n\t\tdom.slides.style.removeProperty( 'right' );\n\t\tdom.slides.style.removeProperty( 'transform' );\n\n\t\tArray.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => {\n\t\t\tslide.style.removeProperty( 'display' );\n\t\t\tslide.style.removeProperty( 'top' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Adds a listener to one of our custom reveal.js events,\n\t * like slidechanged.\n\t */\n\tfunction on( type, listener, useCapture ) {\n\n\t\trevealElement.addEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Unsubscribes from a reveal.js event.\n\t */\n\tfunction off( type, listener, useCapture ) {\n\n\t\trevealElement.removeEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Applies CSS transforms to the slides container. The container\n\t * is transformed from two separate sources: layout and the overview\n\t * mode.\n\t *\n\t * @param {object} transforms\n\t */\n\tfunction transformSlides( transforms ) {\n\n\t\t// Pick up new transforms from arguments\n\t\tif( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout;\n\t\tif( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview;\n\n\t\t// Apply the transforms to the slides container\n\t\tif( slidesTransform.layout ) {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview );\n\t\t}\n\t\telse {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.overview );\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event of the specified type from the\n\t * reveal DOM element.\n\t */\n\tfunction dispatchEvent({ target=dom.wrapper, type, data, bubbles=true }) {\n\n\t\tlet event = document.createEvent( 'HTMLEvents', 1, 2 );\n\t\tevent.initEvent( type, bubbles, true );\n\t\tUtil.extend( event, data );\n\t\ttarget.dispatchEvent( event );\n\n\t\tif( target === dom.wrapper ) {\n\t\t\t// If we're in an iframe, post each reveal.js event to the\n\t\t\t// parent window. Used by the notes plugin\n\t\t\tdispatchPostMessage( type );\n\t\t}\n\n\t\treturn event;\n\n\t}\n\n\t/**\n\t * Dispatches a slidechanged event.\n\t *\n\t * @param {string} origin Used to identify multiplex clients\n\t */\n\tfunction dispatchSlideChanged( origin ) {\n\n\t\tdispatchEvent({\n\t\t\ttype: 'slidechanged',\n\t\t\tdata: {\n\t\t\t\tindexh,\n\t\t\t\tindexv,\n\t\t\t\tpreviousSlide,\n\t\t\t\tcurrentSlide,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Dispatched a postMessage of the given type from our window.\n\t */\n\tfunction dispatchPostMessage( type, data ) {\n\n\t\tif( config.postMessageEvents && window.parent !== window.self ) {\n\t\t\tlet message = {\n\t\t\t\tnamespace: 'reveal',\n\t\t\t\teventName: type,\n\t\t\t\tstate: getState()\n\t\t\t};\n\n\t\t\tUtil.extend( message, data );\n\n\t\t\twindow.parent.postMessage( JSON.stringify( message ), '*' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies JavaScript-controlled layout rules to the\n\t * presentation.\n\t */\n\tfunction layout() {\n\n\t\tif( dom.wrapper && !printView.isActive() ) {\n\n\t\t\tconst viewportWidth = dom.viewport.offsetWidth;\n\t\t\tconst viewportHeight = dom.viewport.offsetHeight;\n\n\t\t\tif( !config.disableLayout ) {\n\n\t\t\t\t// On some mobile devices '100vh' is taller than the visible\n\t\t\t\t// viewport which leads to part of the presentation being\n\t\t\t\t// cut off. To work around this we define our own '--vh' custom\n\t\t\t\t// property where 100x adds up to the correct height.\n\t\t\t\t//\n\t\t\t\t// https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n\t\t\t\tif( Device.isMobile && !config.embedded ) {\n\t\t\t\t\tdocument.documentElement.style.setProperty( '--vh', ( window.innerHeight * 0.01 ) + 'px' );\n\t\t\t\t}\n\n\t\t\t\tconst size = scrollView.isActive() ?\n\t\t\t\t\t\t\t getComputedSlideSize( viewportWidth, viewportHeight ) :\n\t\t\t\t\t\t\t getComputedSlideSize();\n\n\t\t\t\tconst oldScale = scale;\n\n\t\t\t\t// Layout the contents of the slides\n\t\t\t\tlayoutSlideContents( config.width, config.height );\n\n\t\t\t\tdom.slides.style.width = size.width + 'px';\n\t\t\t\tdom.slides.style.height = size.height + 'px';\n\n\t\t\t\t// Determine scale of content to fit within available space\n\t\t\t\tscale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height );\n\n\t\t\t\t// Respect max/min scale settings\n\t\t\t\tscale = Math.max( scale, config.minScale );\n\t\t\t\tscale = Math.min( scale, config.maxScale );\n\n\t\t\t\t// Don't apply any scaling styles if scale is 1 or we're\n\t\t\t\t// in the scroll view\n\t\t\t\tif( scale === 1 || scrollView.isActive() ) {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '';\n\t\t\t\t\tdom.slides.style.top = '';\n\t\t\t\t\tdom.slides.style.bottom = '';\n\t\t\t\t\tdom.slides.style.right = '';\n\t\t\t\t\ttransformSlides( { layout: '' } );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '50%';\n\t\t\t\t\tdom.slides.style.top = '50%';\n\t\t\t\t\tdom.slides.style.bottom = 'auto';\n\t\t\t\t\tdom.slides.style.right = 'auto';\n\t\t\t\t\ttransformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } );\n\t\t\t\t}\n\n\t\t\t\t// Select all slides, vertical and horizontal\n\t\t\t\tconst slides = Array.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) );\n\n\t\t\t\tfor( let i = 0, len = slides.length; i < len; i++ ) {\n\t\t\t\t\tconst slide = slides[ i ];\n\n\t\t\t\t\t// Don't bother updating invisible slides\n\t\t\t\t\tif( slide.style.display === 'none' ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( ( config.center || slide.classList.contains( 'center' ) ) ) {\n\t\t\t\t\t\t// Vertical stacks are not centred since their section\n\t\t\t\t\t\t// children will be\n\t\t\t\t\t\tif( slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\t\t\tslide.style.top = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslide.style.top = Math.max( ( size.height - slide.scrollHeight ) / 2, 0 ) + 'px';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tslide.style.top = '';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif( oldScale !== scale ) {\n\t\t\t\t\tdispatchEvent({\n\t\t\t\t\t\ttype: 'resize',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\toldScale,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\tsize\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcheckResponsiveScrollView();\n\n\t\t\tdom.viewport.style.setProperty( '--slide-scale', scale );\n\t\t\tdom.viewport.style.setProperty( '--viewport-width', viewportWidth + 'px' );\n\t\t\tdom.viewport.style.setProperty( '--viewport-height', viewportHeight + 'px' );\n\n\t\t\tscrollView.layout();\n\n\t\t\tprogress.update();\n\t\t\tbackgrounds.updateParallax();\n\n\t\t\tif( overview.isActive() ) {\n\t\t\t\toverview.update();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies layout logic to the contents of all slides in\n\t * the presentation.\n\t *\n\t * @param {string|number} width\n\t * @param {string|number} height\n\t */\n\tfunction layoutSlideContents( width, height ) {\n\t\t// Handle sizing of elements with the 'r-stretch' class\n\t\tUtil.queryAll( dom.slides, 'section > .stretch, section > .r-stretch' ).forEach( element => {\n\n\t\t\t// Determine how much vertical space we can use\n\t\t\tlet remainingHeight = Util.getRemainingHeight( element, height );\n\n\t\t\t// Consider the aspect ratio of media elements\n\t\t\tif( /(img|video)/gi.test( element.nodeName ) ) {\n\t\t\t\tconst nw = element.naturalWidth || element.videoWidth,\n\t\t\t\t\t nh = element.naturalHeight || element.videoHeight;\n\n\t\t\t\tconst es = Math.min( width / nw, remainingHeight / nh );\n\n\t\t\t\telement.style.width = ( nw * es ) + 'px';\n\t\t\t\telement.style.height = ( nh * es ) + 'px';\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.width = width + 'px';\n\t\t\t\telement.style.height = remainingHeight + 'px';\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Responsively activates the scroll mode when we reach the configured\n\t * activation width.\n\t */\n\tfunction checkResponsiveScrollView() {\n\n\t\t// Only proceed if...\n\t\t// 1. The DOM is ready\n\t\t// 2. Layouts aren't disabled via config\n\t\t// 3. We're not currently printing\n\t\t// 4. There is a scrollActivationWidth set\n\t\t// 5. The deck isn't configured to always use the scroll view\n\t\tif(\n\t\t\tdom.wrapper &&\n\t\t\t!config.disableLayout &&\n\t\t\t!printView.isActive() &&\n\t\t\ttypeof config.scrollActivationWidth === 'number' &&\n\t\t\tconfig.view !== 'scroll'\n\t\t) {\n\t\t\tconst size = getComputedSlideSize();\n\n\t\t\tif( size.presentationWidth > 0 && size.presentationWidth <= config.scrollActivationWidth ) {\n\t\t\t\tif( !scrollView.isActive() ) {\n\t\t\t\t\tbackgrounds.create();\n\t\t\t\t\tscrollView.activate()\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( scrollView.isActive() ) scrollView.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates the computed pixel size of our slides. These\n\t * values are based on the width and height configuration\n\t * options.\n\t *\n\t * @param {number} [presentationWidth=dom.wrapper.offsetWidth]\n\t * @param {number} [presentationHeight=dom.wrapper.offsetHeight]\n\t */\n\tfunction getComputedSlideSize( presentationWidth, presentationHeight ) {\n\n\t\tlet width = config.width;\n\t\tlet height = config.height;\n\n\t\tif( config.disableLayout ) {\n\t\t\twidth = dom.slides.offsetWidth;\n\t\t\theight = dom.slides.offsetHeight;\n\t\t}\n\n\t\tconst size = {\n\t\t\t// Slide size\n\t\t\twidth: width,\n\t\t\theight: height,\n\n\t\t\t// Presentation size\n\t\t\tpresentationWidth: presentationWidth || dom.wrapper.offsetWidth,\n\t\t\tpresentationHeight: presentationHeight || dom.wrapper.offsetHeight\n\t\t};\n\n\t\t// Reduce available space by margin\n\t\tsize.presentationWidth -= ( size.presentationWidth * config.margin );\n\t\tsize.presentationHeight -= ( size.presentationHeight * config.margin );\n\n\t\t// Slide width may be a percentage of available width\n\t\tif( typeof size.width === 'string' && /%$/.test( size.width ) ) {\n\t\t\tsize.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth;\n\t\t}\n\n\t\t// Slide height may be a percentage of available height\n\t\tif( typeof size.height === 'string' && /%$/.test( size.height ) ) {\n\t\t\tsize.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight;\n\t\t}\n\n\t\treturn size;\n\n\t}\n\n\t/**\n\t * Stores the vertical index of a stack so that the same\n\t * vertical slide can be selected when navigating to and\n\t * from the stack.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t * @param {string|number} [v=0] Index to memorize\n\t */\n\tfunction setPreviousVerticalIndex( stack, v ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {\n\t\t\tstack.setAttribute( 'data-previous-indexv', v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieves the vertical index which was stored using\n\t * #setPreviousVerticalIndex() or 0 if no previous index\n\t * exists.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t */\n\tfunction getPreviousVerticalIndex( stack ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {\n\t\t\t// Prefer manually defined start-indexv\n\t\t\tconst attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';\n\n\t\t\treturn parseInt( stack.getAttribute( attributeName ) || 0, 10 );\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is vertical\n\t * (nested within another slide).\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to check\n\t * orientation of\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalSlide( slide = currentSlide ) {\n\n\t\treturn slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is a stack containing\n\t * vertical slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide]\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalStack( slide = currentSlide ) {\n\n\t\treturn slide.classList.contains( '.stack' ) || slide.querySelector( 'section' ) !== null;\n\n\t}\n\n\t/**\n\t * Returns true if we're on the last slide in the current\n\t * vertical stack.\n\t */\n\tfunction isLastVerticalSlide() {\n\n\t\tif( currentSlide && isVerticalSlide( currentSlide ) ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the first slide in\n\t * the presentation.\n\t */\n\tfunction isFirstSlide() {\n\n\t\treturn indexh === 0 && indexv === 0;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the last slide in\n\t * the presentation. If the last slide is a stack, we only\n\t * consider this the last slide if it's at the end of the\n\t * stack.\n\t */\n\tfunction isLastSlide() {\n\n\t\tif( currentSlide ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\t// If it's vertical, does its parent have a next sibling?\n\t\t\tif( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Enters the paused mode which fades everything on screen to\n\t * black.\n\t */\n\tfunction pause() {\n\n\t\tif( config.pause ) {\n\t\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\n\t\t\tcancelAutoSlide();\n\t\t\tdom.wrapper.classList.add( 'paused' );\n\n\t\t\tif( wasPaused === false ) {\n\t\t\t\tdispatchEvent({ type: 'paused' });\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Exits from the paused mode.\n\t */\n\tfunction resume() {\n\n\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\t\tdom.wrapper.classList.remove( 'paused' );\n\n\t\tcueAutoSlide();\n\n\t\tif( wasPaused ) {\n\t\t\tdispatchEvent({ type: 'resumed' });\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the paused mode on and off.\n\t */\n\tfunction togglePause( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? pause() : resume();\n\t\t}\n\t\telse {\n\t\t\tisPaused() ? resume() : pause();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if we are currently in the paused mode.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isPaused() {\n\n\t\treturn dom.wrapper.classList.contains( 'paused' );\n\n\t}\n\n\t/**\n\t * Toggles visibility of the jump-to-slide UI.\n\t */\n\tfunction toggleJumpToSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? jumpToSlide.show() : jumpToSlide.hide();\n\t\t}\n\t\telse {\n\t\t\tjumpToSlide.isVisible() ? jumpToSlide.hide() : jumpToSlide.show();\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the auto slide mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which sets the desired state.\n\t * True means autoplay starts, false means it stops.\n\t */\n\n\tfunction toggleAutoSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t\telse {\n\t\t\tautoSlidePaused ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the auto slide mode is currently on.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isAutoSliding() {\n\n\t\treturn !!( autoSlide && !autoSlidePaused );\n\n\t}\n\n\t/**\n\t * Steps from the current point in the presentation to the\n\t * slide which matches the specified horizontal and vertical\n\t * indices.\n\t *\n\t * @param {number} [h=indexh] Horizontal index of the target slide\n\t * @param {number} [v=indexv] Vertical index of the target slide\n\t * @param {number} [f] Index of a fragment within the\n\t * target slide to activate\n\t * @param {number} [origin] Origin for use in multimaster environments\n\t */\n\tfunction slide( h, v, f, origin ) {\n\n\t\t// Dispatch an event before the slide\n\t\tconst slidechange = dispatchEvent({\n\t\t\ttype: 'beforeslidechange',\n\t\t\tdata: {\n\t\t\t\tindexh: h === undefined ? indexh : h,\n\t\t\t\tindexv: v === undefined ? indexv : v,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t\t// Abort if this slide change was prevented by an event listener\n\t\tif( slidechange.defaultPrevented ) return;\n\n\t\t// Remember where we were at before\n\t\tpreviousSlide = currentSlide;\n\n\t\t// Query all horizontal slides in the deck\n\t\tconst horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );\n\n\t\t// If we're in scroll mode, we scroll the target slide into view\n\t\t// instead of running our standard slide transition\n\t\tif( scrollView.isActive() ) {\n\t\t\tconst scrollToSlide = scrollView.getSlideByIndices( h, v );\n\t\t\tif( scrollToSlide ) scrollView.scrollToSlide( scrollToSlide );\n\t\t\treturn;\n\t\t}\n\n\t\t// Abort if there are no slides\n\t\tif( horizontalSlides.length === 0 ) return;\n\n\t\t// If no vertical index is specified and the upcoming slide is a\n\t\t// stack, resume at its previous vertical index\n\t\tif( v === undefined && !overview.isActive() ) {\n\t\t\tv = getPreviousVerticalIndex( horizontalSlides[ h ] );\n\t\t}\n\n\t\t// If we were on a vertical stack, remember what vertical index\n\t\t// it was on so we can resume at the same position when returning\n\t\tif( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {\n\t\t\tsetPreviousVerticalIndex( previousSlide.parentNode, indexv );\n\t\t}\n\n\t\t// Remember the state before this slide\n\t\tconst stateBefore = state.concat();\n\n\t\t// Reset the state array\n\t\tstate.length = 0;\n\n\t\tlet indexhBefore = indexh || 0,\n\t\t\tindexvBefore = indexv || 0;\n\n\t\t// Activate and transition to the new slide\n\t\tindexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );\n\t\tindexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );\n\n\t\t// Dispatch an event if the slide changed\n\t\tlet slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );\n\n\t\t// Ensure that the previous slide is never the same as the current\n\t\tif( !slideChanged ) previousSlide = null;\n\n\t\t// Find the current horizontal slide and any possible vertical slides\n\t\t// within it\n\t\tlet currentHorizontalSlide = horizontalSlides[ indexh ],\n\t\t\tcurrentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );\n\n\t\t// Indicate when we're on a vertical slide\n\t\trevealElement.classList.toggle( 'is-vertical-slide', currentVerticalSlides.length > 1 );\n\n\t\t// Store references to the previous and current slides\n\t\tcurrentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;\n\n\t\tlet autoAnimateTransition = false;\n\n\t\t// Detect if we're moving between two auto-animated slides\n\t\tif( slideChanged && previousSlide && currentSlide && !overview.isActive() ) {\n\t\t\ttransition = 'running';\n\n\t\t\tautoAnimateTransition = shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexvBefore );\n\n\t\t\t// If this is an auto-animated transition, we disable the\n\t\t\t// regular slide transition\n\t\t\t//\n\t\t\t// Note 20-03-2020:\n\t\t\t// This needs to happen before we update slide visibility,\n\t\t\t// otherwise transitions will still run in Safari.\n\t\t\tif( autoAnimateTransition ) {\n\t\t\t\tdom.slides.classList.add( 'disable-slide-transitions' )\n\t\t\t}\n\t\t}\n\n\t\t// Update the visibility of slides now that the indices have changed\n\t\tupdateSlidesVisibility();\n\n\t\tlayout();\n\n\t\t// Update the overview if it's currently active\n\t\tif( overview.isActive() ) {\n\t\t\toverview.update();\n\t\t}\n\n\t\t// Show fragment, if specified\n\t\tif( typeof f !== 'undefined' ) {\n\t\t\tfragments.goto( f );\n\t\t}\n\n\t\t// Solves an edge case where the previous slide maintains the\n\t\t// 'present' class when navigating between adjacent vertical\n\t\t// stacks\n\t\tif( previousSlide && previousSlide !== currentSlide ) {\n\t\t\tpreviousSlide.classList.remove( 'present' );\n\t\t\tpreviousSlide.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t// Reset all slides upon navigate to home\n\t\t\tif( isFirstSlide() ) {\n\t\t\t\t// Launch async task\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tgetVerticalStacks().forEach( slide => {\n\t\t\t\t\t\tsetPreviousVerticalIndex( slide, 0 );\n\t\t\t\t\t} );\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t}\n\n\t\t// Apply the new state\n\t\tstateLoop: for( let i = 0, len = state.length; i < len; i++ ) {\n\t\t\t// Check if this state existed on the previous slide. If it\n\t\t\t// did, we will avoid adding it repeatedly\n\t\t\tfor( let j = 0; j < stateBefore.length; j++ ) {\n\t\t\t\tif( stateBefore[j] === state[i] ) {\n\t\t\t\t\tstateBefore.splice( j, 1 );\n\t\t\t\t\tcontinue stateLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.classList.add( state[i] );\n\n\t\t\t// Dispatch custom event matching the state's name\n\t\t\tdispatchEvent({ type: state[i] });\n\t\t}\n\n\t\t// Clean up the remains of the previous state\n\t\twhile( stateBefore.length ) {\n\t\t\tdom.viewport.classList.remove( stateBefore.pop() );\n\t\t}\n\n\t\tif( slideChanged ) {\n\t\t\tdispatchSlideChanged( origin );\n\t\t}\n\n\t\t// Handle embedded content\n\t\tif( slideChanged || !previousSlide ) {\n\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\t// Announce the current slide contents to screen readers\n\t\t// Use animation frame to prevent getComputedStyle in getStatusText\n\t\t// from triggering layout mid-frame\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tprogress.update();\n\t\tcontrols.update();\n\t\tnotes.update();\n\t\tbackgrounds.update();\n\t\tbackgrounds.updateParallax();\n\t\tslideNumber.update();\n\t\tfragments.update();\n\n\t\t// Update the URL hash\n\t\tlocation.writeURL();\n\n\t\tcueAutoSlide();\n\n\t\t// Auto-animation\n\t\tif( autoAnimateTransition ) {\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tdom.slides.classList.remove( 'disable-slide-transitions' );\n\t\t\t}, 0 );\n\n\t\t\tif( config.autoAnimate ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks whether or not an auto-animation should take place between\n\t * the two given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t * @param {number} indexhBefore\n\t * @param {number} indexvBefore\n\t *\n\t * @returns {boolean}\n\t */\n\tfunction shouldAutoAnimateBetween( fromSlide, toSlide, indexhBefore, indexvBefore ) {\n\n\t\treturn \tfromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) &&\n\t\t\t\tfromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) &&\n\t\t\t\t!( ( indexh > indexhBefore || indexv > indexvBefore ) ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' );\n\n\t}\n\n\t/**\n\t * Called anytime a new slide should be activated while in the scroll\n\t * view. The active slide is the page that occupies the most space in\n\t * the scrollable viewport.\n\t *\n\t * @param {number} pageIndex\n\t * @param {HTMLElement} slideElement\n\t */\n\tfunction setCurrentScrollPage( slideElement, h, v ) {\n\n\t\tlet indexhBefore = indexh || 0;\n\n\t\tindexh = h;\n\t\tindexv = v;\n\n\t\tconst slideChanged = currentSlide !== slideElement;\n\n\t\tpreviousSlide = currentSlide;\n\t\tcurrentSlide = slideElement;\n\n\t\tif( currentSlide && previousSlide ) {\n\t\t\tif( config.autoAnimate && shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexv ) ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\t\t}\n\n\t\t// Start or stop embedded content like videos and iframes\n\t\tif( slideChanged ) {\n\t\t\tif( previousSlide ) {\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide.slideBackgroundElement );\n\t\t\t}\n\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide.slideBackgroundElement );\n\t\t}\n\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tdispatchSlideChanged();\n\n\t}\n\n\t/**\n\t * Syncs the presentation with the current DOM. Useful\n\t * when new slides or control elements are added or when\n\t * the configuration has changed.\n\t */\n\tfunction sync() {\n\n\t\t// Subscribe to input\n\t\tremoveEventListeners();\n\t\taddEventListeners();\n\n\t\t// Force a layout to make sure the current config is accounted for\n\t\tlayout();\n\n\t\t// Reflect the current autoSlide value\n\t\tautoSlide = config.autoSlide;\n\n\t\t// Start auto-sliding if it's enabled\n\t\tcueAutoSlide();\n\n\t\t// Re-create all slide backgrounds\n\t\tbackgrounds.create();\n\n\t\t// Write the current hash to the URL\n\t\tlocation.writeURL();\n\n\t\tif( config.sortFragmentsOnSync === true ) {\n\t\t\tfragments.sortAll();\n\t\t}\n\n\t\tcontrols.update();\n\t\tprogress.update();\n\n\t\tupdateSlidesVisibility();\n\n\t\tnotes.update();\n\t\tnotes.updateVisibility();\n\t\toverlay.update();\n\t\tbackgrounds.update( true );\n\t\tslideNumber.update();\n\t\tslideContent.formatEmbeddedContent();\n\n\t\t// Start or stop embedded content depending on global config\n\t\tif( config.autoPlayMedia === false ) {\n\t\t\tslideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } );\n\t\t}\n\t\telse {\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\tif( overview.isActive() ) {\n\t\t\toverview.layout();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates reveal.js to keep in sync with new slide attributes. For\n\t * example, if you add a new `data-background-image` you can call\n\t * this to have reveal.js render the new background image.\n\t *\n\t * Similar to #sync() but more efficient when you only need to\n\t * refresh a specific slide.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tfunction syncSlide( slide = currentSlide ) {\n\n\t\tbackgrounds.sync( slide );\n\t\tfragments.sync( slide );\n\n\t\tslideContent.load( slide );\n\n\t\tbackgrounds.update();\n\t\tnotes.update();\n\n\t}\n\n\t/**\n\t * Resets all vertical slides so that only the first\n\t * is visible.\n\t */\n\tfunction resetVerticalSlides() {\n\n\t\tgetHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tUtil.queryAll( horizontalSlide, 'section' ).forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tif( y > 0 ) {\n\t\t\t\t\tverticalSlide.classList.remove( 'present' );\n\t\t\t\t\tverticalSlide.classList.remove( 'past' );\n\t\t\t\t\tverticalSlide.classList.add( 'future' );\n\t\t\t\t\tverticalSlide.setAttribute( 'aria-hidden', 'true' );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Randomly shuffles all slides in the deck.\n\t */\n\tfunction shuffle( slides = getHorizontalSlides() ) {\n\n\t\tslides.forEach( ( slide, i ) => {\n\n\t\t\t// Insert the slide next to a randomly picked sibling slide\n\t\t\t// slide. This may cause the slide to insert before itself,\n\t\t\t// but that's not an issue.\n\t\t\tlet beforeSlide = slides[ Math.floor( Math.random() * slides.length ) ];\n\t\t\tif( beforeSlide.parentNode === slide.parentNode ) {\n\t\t\t\tslide.parentNode.insertBefore( slide, beforeSlide );\n\t\t\t}\n\n\t\t\t// Randomize the order of vertical slides (if there are any)\n\t\t\tlet verticalSlides = slide.querySelectorAll( 'section' );\n\t\t\tif( verticalSlides.length ) {\n\t\t\t\tshuffle( verticalSlides );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates one dimension of slides by showing the slide\n\t * with the specified index.\n\t *\n\t * @param {string} selector A CSS selector that will fetch\n\t * the group of slides we are working with\n\t * @param {number} index The index of the slide that should be\n\t * shown\n\t *\n\t * @return {number} The index of the slide that is now shown,\n\t * might differ from the passed in index if it was out of\n\t * bounds.\n\t */\n\tfunction updateSlides( selector, index ) {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet slides = Util.queryAll( dom.wrapper, selector ),\n\t\t\tslidesLength = slides.length;\n\n\t\tlet printMode = scrollView.isActive() || printView.isActive();\n\t\tlet loopedForwards = false;\n\t\tlet loopedBackwards = false;\n\n\t\tif( slidesLength ) {\n\n\t\t\t// Should the index loop?\n\t\t\tif( config.loop ) {\n\t\t\t\tif( index >= slidesLength ) loopedForwards = true;\n\n\t\t\t\tindex %= slidesLength;\n\n\t\t\t\tif( index < 0 ) {\n\t\t\t\t\tindex = slidesLength + index;\n\t\t\t\t\tloopedBackwards = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Enforce max and minimum index bounds\n\t\t\tindex = Math.max( Math.min( index, slidesLength - 1 ), 0 );\n\n\t\t\tfor( let i = 0; i < slidesLength; i++ ) {\n\t\t\t\tlet element = slides[i];\n\n\t\t\t\tlet reverse = config.rtl && !isVerticalSlide( element );\n\n\t\t\t\t// Avoid .remove() with multiple args for IE11 support\n\t\t\t\telement.classList.remove( 'past' );\n\t\t\t\telement.classList.remove( 'present' );\n\t\t\t\telement.classList.remove( 'future' );\n\n\t\t\t\t// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute\n\t\t\t\telement.setAttribute( 'hidden', '' );\n\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t\t// If this element contains vertical slides\n\t\t\t\tif( element.querySelector( 'section' ) ) {\n\t\t\t\t\telement.classList.add( 'stack' );\n\t\t\t\t}\n\n\t\t\t\t// If we're printing static slides, all slides are \"present\"\n\t\t\t\tif( printMode ) {\n\t\t\t\t\telement.classList.add( 'present' );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif( i < index ) {\n\t\t\t\t\t// Any element previous to index is given the 'past' class\n\t\t\t\t\telement.classList.add( reverse ? 'future' : 'past' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Show all fragments in prior slides\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( i > index ) {\n\t\t\t\t\t// Any element subsequent to index is given the 'future' class\n\t\t\t\t\telement.classList.add( reverse ? 'past' : 'future' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Hide all fragments in future slides\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Update the visibility of fragments when a presentation loops\n\t\t\t\t// in either direction\n\t\t\t\telse if( i === index && config.fragments ) {\n\t\t\t\t\tif( loopedForwards ) {\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t\telse if( loopedBackwards ) {\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet slide = slides[index];\n\t\t\tlet wasPresent = slide.classList.contains( 'present' );\n\n\t\t\t// Mark the current slide as present\n\t\t\tslide.classList.add( 'present' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\n\t\t\tif( !wasPresent ) {\n\t\t\t\t// Dispatch an event indicating the slide is now visible\n\t\t\t\tdispatchEvent({\n\t\t\t\t\ttarget: slide,\n\t\t\t\t\ttype: 'visible',\n\t\t\t\t\tbubbles: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If this slide has a state associated with it, add it\n\t\t\t// onto the current state of the deck\n\t\t\tlet slideState = slide.getAttribute( 'data-state' );\n\t\t\tif( slideState ) {\n\t\t\t\tstate = state.concat( slideState.split( ' ' ) );\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\t// Since there are no slides we can't be anywhere beyond the\n\t\t\t// zeroth index\n\t\t\tindex = 0;\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Shows all fragment elements within the given container.\n\t */\n\tfunction showFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment' ).forEach( fragment => {\n\t\t\tfragment.classList.add( 'visible' );\n\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Hides all fragment elements within the given container.\n\t */\n\tfunction hideFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment.visible' ).forEach( fragment => {\n\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Optimization method; hide all slides that are far away\n\t * from the present slide.\n\t */\n\tfunction updateSlidesVisibility() {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet horizontalSlides = getHorizontalSlides(),\n\t\t\thorizontalSlidesLength = horizontalSlides.length,\n\t\t\tdistanceX,\n\t\t\tdistanceY;\n\n\t\tif( horizontalSlidesLength && typeof indexh !== 'undefined' ) {\n\n\t\t\tconst isOverview = overview.isActive();\n\n\t\t\t// The number of steps away from the present slide that will\n\t\t\t// be visible\n\t\t\tlet viewDistance = isOverview ? 10 : config.viewDistance;\n\n\t\t\t// Shorten the view distance on devices that typically have\n\t\t\t// less resources\n\t\t\tif( Device.isMobile ) {\n\t\t\t\tviewDistance = isOverview ? 6 : config.mobileViewDistance;\n\t\t\t}\n\n\t\t\t// All slides need to be visible when exporting to PDF\n\t\t\tif( printView.isActive() ) {\n\t\t\t\tviewDistance = Number.MAX_VALUE;\n\t\t\t}\n\n\t\t\tfor( let x = 0; x < horizontalSlidesLength; x++ ) {\n\t\t\t\tlet horizontalSlide = horizontalSlides[x];\n\n\t\t\t\tlet verticalSlides = Util.queryAll( horizontalSlide, 'section' ),\n\t\t\t\t\tverticalSlidesLength = verticalSlides.length;\n\n\t\t\t\t// Determine how far away this slide is from the present\n\t\t\t\tdistanceX = Math.abs( ( indexh || 0 ) - x ) || 0;\n\n\t\t\t\t// If the presentation is looped, distance should measure\n\t\t\t\t// 1 between the first and last slides\n\t\t\t\tif( config.loop ) {\n\t\t\t\t\tdistanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;\n\t\t\t\t}\n\n\t\t\t\t// Show the horizontal slide if it's within the view distance\n\t\t\t\tif( distanceX < viewDistance ) {\n\t\t\t\t\tslideContent.load( horizontalSlide );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslideContent.unload( horizontalSlide );\n\t\t\t\t}\n\n\t\t\t\tif( verticalSlidesLength ) {\n\n\t\t\t\t\tlet oy = isOverview ? 0 : getPreviousVerticalIndex( horizontalSlide );\n\n\t\t\t\t\tfor( let y = 0; y < verticalSlidesLength; y++ ) {\n\t\t\t\t\t\tlet verticalSlide = verticalSlides[y];\n\n\t\t\t\t\t\tdistanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy );\n\n\t\t\t\t\t\tif( distanceX + distanceY < viewDistance ) {\n\t\t\t\t\t\t\tslideContent.load( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslideContent.unload( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flag if there are ANY vertical slides, anywhere in the deck\n\t\t\tif( hasVerticalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-vertical-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-vertical-slides' );\n\t\t\t}\n\n\t\t\t// Flag if there are ANY horizontal slides, anywhere in the deck\n\t\t\tif( hasHorizontalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-horizontal-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-horizontal-slides' );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Determine what available routes there are for navigation.\n\t *\n\t * @return {{left: boolean, right: boolean, up: boolean, down: boolean}}\n\t */\n\tfunction availableRoutes({ includeFragments = false } = {}) {\n\n\t\tlet horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),\n\t\t\tverticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR );\n\n\t\tlet routes = {\n\t\t\tleft: indexh > 0,\n\t\t\tright: indexh < horizontalSlides.length - 1,\n\t\t\tup: indexv > 0,\n\t\t\tdown: indexv < verticalSlides.length - 1\n\t\t};\n\n\t\t// Looped presentations can always be navigated as long as\n\t\t// there are slides available\n\t\tif( config.loop ) {\n\t\t\tif( horizontalSlides.length > 1 ) {\n\t\t\t\troutes.left = true;\n\t\t\t\troutes.right = true;\n\t\t\t}\n\n\t\t\tif( verticalSlides.length > 1 ) {\n\t\t\t\troutes.up = true;\n\t\t\t\troutes.down = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( horizontalSlides.length > 1 && config.navigationMode === 'linear' ) {\n\t\t\troutes.right = routes.right || routes.down;\n\t\t\troutes.left = routes.left || routes.up;\n\t\t}\n\n\t\t// If includeFragments is set, a route will be considered\n\t\t// available if either a slid OR fragment is available in\n\t\t// the given direction\n\t\tif( includeFragments === true ) {\n\t\t\tlet fragmentRoutes = fragments.availableRoutes();\n\t\t\troutes.left = routes.left || fragmentRoutes.prev;\n\t\t\troutes.up = routes.up || fragmentRoutes.prev;\n\t\t\troutes.down = routes.down || fragmentRoutes.next;\n\t\t\troutes.right = routes.right || fragmentRoutes.next;\n\t\t}\n\n\t\t// Reverse horizontal controls for rtl\n\t\tif( config.rtl ) {\n\t\t\tlet left = routes.left;\n\t\t\troutes.left = routes.right;\n\t\t\troutes.right = left;\n\t\t}\n\n\t\treturn routes;\n\n\t}\n\n\t/**\n\t * Returns the number of past slides. This can be used as a global\n\t * flattened index for slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide we're counting before\n\t *\n\t * @return {number} Past slide count\n\t */\n\tfunction getSlidePastCount( slide = currentSlide ) {\n\n\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t// The number of past slides\n\t\tlet pastCount = 0;\n\n\t\t// Step through all slides and count the past ones\n\t\tmainLoop: for( let i = 0; i < horizontalSlides.length; i++ ) {\n\n\t\t\tlet horizontalSlide = horizontalSlides[i];\n\t\t\tlet verticalSlides = horizontalSlide.querySelectorAll( 'section' );\n\n\t\t\tfor( let j = 0; j < verticalSlides.length; j++ ) {\n\n\t\t\t\t// Stop as soon as we arrive at the present\n\t\t\t\tif( verticalSlides[j] === slide ) {\n\t\t\t\t\tbreak mainLoop;\n\t\t\t\t}\n\n\t\t\t\t// Don't count slides with the \"uncounted\" class\n\t\t\t\tif( verticalSlides[j].dataset.visibility !== 'uncounted' ) {\n\t\t\t\t\tpastCount++;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Stop as soon as we arrive at the present\n\t\t\tif( horizontalSlide === slide ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Don't count the wrapping section for vertical slides and\n\t\t\t// slides marked as uncounted\n\t\t\tif( horizontalSlide.classList.contains( 'stack' ) === false && horizontalSlide.dataset.visibility !== 'uncounted' ) {\n\t\t\t\tpastCount++;\n\t\t\t}\n\n\t\t}\n\n\t\treturn pastCount;\n\n\t}\n\n\t/**\n\t * Returns a value ranging from 0-1 that represents\n\t * how far into the presentation we have navigated.\n\t *\n\t * @return {number}\n\t */\n\tfunction getProgress() {\n\n\t\t// The number of past and total slides\n\t\tlet totalCount = getTotalSlides();\n\t\tlet pastCount = getSlidePastCount();\n\n\t\tif( currentSlide ) {\n\n\t\t\tlet allFragments = currentSlide.querySelectorAll( '.fragment' );\n\n\t\t\t// If there are fragments in the current slide those should be\n\t\t\t// accounted for in the progress.\n\t\t\tif( allFragments.length > 0 ) {\n\t\t\t\tlet visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );\n\n\t\t\t\t// This value represents how big a portion of the slide progress\n\t\t\t\t// that is made up by its fragments (0-1)\n\t\t\t\tlet fragmentWeight = 0.9;\n\n\t\t\t\t// Add fragment progress to the past slide count\n\t\t\t\tpastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight;\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.min( pastCount / ( totalCount - 1 ), 1 );\n\n\t}\n\n\t/**\n\t * Retrieves the h/v location and fragment of the current,\n\t * or specified, slide.\n\t *\n\t * @param {HTMLElement} [slide] If specified, the returned\n\t * index will be for this slide rather than the currently\n\t * active one\n\t *\n\t * @return {{h: number, v: number, f: number}}\n\t */\n\tfunction getIndices( slide ) {\n\n\t\t// By default, return the current indices\n\t\tlet h = indexh,\n\t\t\tv = indexv,\n\t\t\tf;\n\n\t\t// If a slide is specified, return the indices of that slide\n\t\tif( slide ) {\n\t\t\t// In scroll mode the original h/x index is stored on the slide\n\t\t\tif( scrollView.isActive() ) {\n\t\t\t\th = parseInt( slide.getAttribute( 'data-index-h' ), 10 );\n\n\t\t\t\tif( slide.getAttribute( 'data-index-v' ) ) {\n\t\t\t\t\tv = parseInt( slide.getAttribute( 'data-index-v' ), 10 );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet isVertical = isVerticalSlide( slide );\n\t\t\t\tlet slideh = isVertical ? slide.parentNode : slide;\n\n\t\t\t\t// Select all horizontal slides\n\t\t\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t\t\t// Now that we know which the horizontal slide is, get its index\n\t\t\t\th = Math.max( horizontalSlides.indexOf( slideh ), 0 );\n\n\t\t\t\t// Assume we're not vertical\n\t\t\t\tv = undefined;\n\n\t\t\t\t// If this is a vertical slide, grab the vertical index\n\t\t\t\tif( isVertical ) {\n\t\t\t\t\tv = Math.max( Util.queryAll( slide.parentNode, 'section' ).indexOf( slide ), 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !slide && currentSlide ) {\n\t\t\tlet hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;\n\t\t\tif( hasFragments ) {\n\t\t\t\tlet currentFragment = currentSlide.querySelector( '.current-fragment' );\n\t\t\t\tif( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\tf = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tf = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { h, v, f };\n\n\t}\n\n\t/**\n\t * Retrieves all slides in this presentation.\n\t */\n\tfunction getSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, SLIDES_SELECTOR + ':not(.stack):not([data-visibility=\"uncounted\"])' );\n\n\t}\n\n\t/**\n\t * Returns a list of all horizontal slides in the deck. Each\n\t * vertical stack is included as one horizontal slide in the\n\t * resulting array.\n\t */\n\tfunction getHorizontalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR );\n\n\t}\n\n\t/**\n\t * Returns all vertical slides that exist within this deck.\n\t */\n\tfunction getVerticalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, '.slides>section>section' );\n\n\t}\n\n\t/**\n\t * Returns all vertical stacks (each stack can contain multiple slides).\n\t */\n\tfunction getVerticalStacks() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.stack');\n\n\t}\n\n\t/**\n\t * Returns true if there are at least two horizontal slides.\n\t */\n\tfunction hasHorizontalSlides() {\n\n\t\treturn getHorizontalSlides().length > 1;\n\t}\n\n\t/**\n\t * Returns true if there are at least two vertical slides.\n\t */\n\tfunction hasVerticalSlides() {\n\n\t\treturn getVerticalSlides().length > 1;\n\n\t}\n\n\t/**\n\t * Returns an array of objects where each object represents the\n\t * attributes on its respective slide.\n\t */\n\tfunction getSlidesAttributes() {\n\n\t\treturn getSlides().map( slide => {\n\n\t\t\tlet attributes = {};\n\t\t\tfor( let i = 0; i < slide.attributes.length; i++ ) {\n\t\t\t\tlet attribute = slide.attributes[ i ];\n\t\t\t\tattributes[ attribute.name ] = attribute.value;\n\t\t\t}\n\t\t\treturn attributes;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Retrieves the total number of slides in this presentation.\n\t *\n\t * @return {number}\n\t */\n\tfunction getTotalSlides() {\n\n\t\treturn getSlides().length;\n\n\t}\n\n\t/**\n\t * Returns the slide element matching the specified index.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction getSlide( x, y ) {\n\n\t\tlet horizontalSlide = getHorizontalSlides()[ x ];\n\t\tlet verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );\n\n\t\tif( verticalSlides && verticalSlides.length && typeof y === 'number' ) {\n\t\t\treturn verticalSlides ? verticalSlides[ y ] : undefined;\n\t\t}\n\n\t\treturn horizontalSlide;\n\n\t}\n\n\t/**\n\t * Returns the background element for the given slide.\n\t * All slides, even the ones with no background properties\n\t * defined, have a background element so as long as the\n\t * index is valid an element will be returned.\n\t *\n\t * @param {mixed} x Horizontal background index OR a slide\n\t * HTML element\n\t * @param {number} y Vertical background index\n\t * @return {(HTMLElement[]|*)}\n\t */\n\tfunction getSlideBackground( x, y ) {\n\n\t\tlet slide = typeof x === 'number' ? getSlide( x, y ) : x;\n\t\tif( slide ) {\n\t\t\treturn slide.slideBackgroundElement;\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Retrieves the current state of the presentation as\n\t * an object. This state can then be restored at any\n\t * time.\n\t *\n\t * @return {{indexh: number, indexv: number, indexf: number, paused: boolean, overview: boolean}}\n\t */\n\tfunction getState() {\n\n\t\tlet indices = getIndices();\n\n\t\treturn {\n\t\t\tindexh: indices.h,\n\t\t\tindexv: indices.v,\n\t\t\tindexf: indices.f,\n\t\t\tpaused: isPaused(),\n\t\t\toverview: overview.isActive(),\n\t\t\t...overlay.getState()\n\t\t};\n\n\t}\n\n\t/**\n\t * Restores the presentation to the given state.\n\t *\n\t * @param {object} state As generated by getState()\n\t * @see {@link getState} generates the parameter `state`\n\t */\n\tfunction setState( state ) {\n\n\t\tif( typeof state === 'object' ) {\n\t\t\tslide( Util.deserialize( state.indexh ), Util.deserialize( state.indexv ), Util.deserialize( state.indexf ) );\n\n\t\t\tlet pausedFlag = Util.deserialize( state.paused ),\n\t\t\t\toverviewFlag = Util.deserialize( state.overview );\n\n\t\t\tif( typeof pausedFlag === 'boolean' && pausedFlag !== isPaused() ) {\n\t\t\t\ttogglePause( pausedFlag );\n\t\t\t}\n\n\t\t\tif( typeof overviewFlag === 'boolean' && overviewFlag !== overview.isActive() ) {\n\t\t\t\toverview.toggle( overviewFlag );\n\t\t\t}\n\n\t\t\toverlay.setState( state );\n\t\t}\n\n\t}\n\n\t/**\n\t * Cues a new automated slide if enabled in the config.\n\t */\n\tfunction cueAutoSlide() {\n\n\t\tcancelAutoSlide();\n\n\t\tif( currentSlide && config.autoSlide !== false ) {\n\n\t\t\tlet fragment = currentSlide.querySelector( '.current-fragment[data-autoslide]' );\n\n\t\t\tlet fragmentAutoSlide = fragment ? fragment.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );\n\n\t\t\t// Pick value in the following priority order:\n\t\t\t// 1. Current fragment's data-autoslide\n\t\t\t// 2. Current slide's data-autoslide\n\t\t\t// 3. Parent slide's data-autoslide\n\t\t\t// 4. Global autoSlide setting\n\t\t\tif( fragmentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( fragmentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( slideAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( slideAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( parentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( parentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tautoSlide = config.autoSlide;\n\n\t\t\t\t// If there are media elements with data-autoplay,\n\t\t\t\t// automatically set the autoSlide duration to the\n\t\t\t\t// length of that media. Not applicable if the slide\n\t\t\t\t// is divided up into fragments.\n\t\t\t\t// playbackRate is accounted for in the duration.\n\t\t\t\tif( currentSlide.querySelectorAll( '.fragment' ).length === 0 ) {\n\t\t\t\t\tUtil.queryAll( currentSlide, 'video, audio' ).forEach( el => {\n\t\t\t\t\t\tif( el.hasAttribute( 'data-autoplay' ) ) {\n\t\t\t\t\t\t\tif( autoSlide && (el.duration * 1000 / el.playbackRate ) > autoSlide ) {\n\t\t\t\t\t\t\t\tautoSlide = ( el.duration * 1000 / el.playbackRate ) + 1000;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cue the next auto-slide if:\n\t\t\t// - There is an autoSlide value\n\t\t\t// - Auto-sliding isn't paused by the user\n\t\t\t// - The presentation isn't paused\n\t\t\t// - The overview isn't active\n\t\t\t// - The presentation isn't over\n\t\t\tif( autoSlide && !autoSlidePaused && !isPaused() && !overview.isActive() && ( !isLastSlide() || fragments.availableRoutes().next || config.loop === true ) ) {\n\t\t\t\tautoSlideTimeout = setTimeout( () => {\n\t\t\t\t\tif( typeof config.autoSlideMethod === 'function' ) {\n\t\t\t\t\t\tconfig.autoSlideMethod()\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnavigateNext();\n\t\t\t\t\t}\n\t\t\t\t\tcueAutoSlide();\n\t\t\t\t}, autoSlide );\n\t\t\t\tautoSlideStartTime = Date.now();\n\t\t\t}\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Cancels any ongoing request to auto-slide.\n\t */\n\tfunction cancelAutoSlide() {\n\n\t\tclearTimeout( autoSlideTimeout );\n\t\tautoSlideTimeout = -1;\n\n\t}\n\n\tfunction pauseAutoSlide() {\n\n\t\tif( autoSlide && !autoSlidePaused ) {\n\t\t\tautoSlidePaused = true;\n\t\t\tdispatchEvent({ type: 'autoslidepaused' });\n\t\t\tclearTimeout( autoSlideTimeout );\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( false );\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction resumeAutoSlide() {\n\n\t\tif( autoSlide && autoSlidePaused ) {\n\t\t\tautoSlidePaused = false;\n\t\t\tdispatchEvent({ type: 'autoslideresumed' });\n\t\t\tcueAutoSlide();\n\t\t}\n\n\t}\n\n\tfunction navigateLeft({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().left ) {\n\t\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().left ) {\n\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateRight({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().right ) {\n\t\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().right ) {\n\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateUp({skipFragments=false}={}) {\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Prioritize hiding fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().up ) {\n\t\t\tslide( indexh, indexv - 1 );\n\t\t}\n\n\t}\n\n\tfunction navigateDown({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Prioritize revealing fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().down ) {\n\t\t\tslide( indexh, indexv + 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Navigates backwards, prioritized in the following order:\n\t * 1) Previous fragment\n\t * 2) Previous vertical slide\n\t * 3) Previous horizontal slide\n\t */\n\tfunction navigatePrev({skipFragments=false}={}) {\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.prev() === false ) {\n\t\t\tif( availableRoutes().up ) {\n\t\t\t\tnavigateUp({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Fetch the previous horizontal slide, if there is one\n\t\t\t\tlet previousSlide;\n\n\t\t\t\tif( config.rtl ) {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.future' ).pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.past' ).pop();\n\t\t\t\t}\n\n\t\t\t\t// When going backwards and arriving on a stack we start\n\t\t\t\t// at the bottom of the stack\n\t\t\t\tif( previousSlide && previousSlide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tlet v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;\n\t\t\t\t\tlet h = indexh - 1;\n\t\t\t\t\tslide( h, v );\n\t\t\t\t}\n\t\t\t\telse if( config.rtl ) {\n\t\t\t\t\tnavigateRight({skipFragments});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * The reverse of #navigatePrev().\n\t */\n\tfunction navigateNext({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.next() === false ) {\n\n\t\t\tlet routes = availableRoutes();\n\n\t\t\t// When looping is enabled `routes.down` is always available\n\t\t\t// so we need a separate check for when we've reached the\n\t\t\t// end of a stack and should move horizontally\n\t\t\tif( routes.down && routes.right && config.loop && isLastVerticalSlide() ) {\n\t\t\t\troutes.down = false;\n\t\t\t}\n\n\t\t\tif( routes.down ) {\n\t\t\t\tnavigateDown({skipFragments});\n\t\t\t}\n\t\t\telse if( config.rtl ) {\n\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnavigateRight({skipFragments});\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ----------------------------- EVENTS -------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t/**\n\t * Called by all event handlers that are based on user\n\t * input.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onUserInput( event ) {\n\n\t\tif( config.autoSlideStoppable ) {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t* Listener for post message events posted to this window.\n\t*/\n\tfunction onPostMessage( event ) {\n\n\t\tlet data = event.data;\n\n\t\t// Make sure we're dealing with JSON\n\t\tif( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) {\n\t\t\tdata = JSON.parse( data );\n\n\t\t\t// Check if the requested method can be found\n\t\t\tif( data.method && typeof Reveal[data.method] === 'function' ) {\n\n\t\t\t\tif( POST_MESSAGE_METHOD_BLACKLIST.test( data.method ) === false ) {\n\n\t\t\t\t\tconst result = Reveal[data.method].apply( Reveal, data.args );\n\n\t\t\t\t\t// Dispatch a postMessage event with the returned value from\n\t\t\t\t\t// our method invocation for getter functions\n\t\t\t\t\tdispatchPostMessage( 'callback', { method: data.method, result: result } );\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.warn( 'reveal.js: \"'+ data.method +'\" is is blacklisted from the postMessage API' );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Event listener for transition end on the current slide.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onTransitionEnd( event ) {\n\n\t\tif( transition === 'running' && /section/gi.test( event.target.nodeName ) ) {\n\t\t\ttransition = 'idle';\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'slidetransitionend',\n\t\t\t\tdata: { indexh, indexv, previousSlide, currentSlide }\n\t\t\t});\n\t\t}\n\n\t}\n\n\t/**\n\t * A global listener for all click events inside of the\n\t * .slides container.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onSlidesClicked( event ) {\n\n\t\tconst anchor = Util.closest( event.target, 'a[href^=\"#\"]' );\n\n\t\t// If a hash link is clicked, we find the target slide\n\t\t// and navigate to it. We previously relied on 'hashchange'\n\t\t// for links like these but that prevented media with\n\t\t// audio tracks from playing in mobile browsers since it\n\t\t// wasn't considered a direct interaction with the document.\n\t\tif( anchor ) {\n\t\t\tconst hash = anchor.getAttribute( 'href' );\n\t\t\tconst indices = location.getIndicesFromHash( hash );\n\n\t\t\tif( indices ) {\n\t\t\t\tReveal.slide( indices.h, indices.v, indices.f );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the window level 'resize' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onWindowResize( event ) {\n\n\t\tlayout();\n\t}\n\n\t/**\n\t * Handle for the window level 'visibilitychange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onPageVisibilityChange( event ) {\n\n\t\t// If, after clicking a link or similar and we're coming back,\n\t\t// focus the document.body to ensure we can use keyboard shortcuts\n\t\tif( document.hidden === false && document.activeElement !== document.body ) {\n\t\t\t// Not all elements support .blur() - SVGs among them.\n\t\t\tif( typeof document.activeElement.blur === 'function' ) {\n\t\t\t\tdocument.activeElement.blur();\n\t\t\t}\n\t\t\tdocument.body.focus();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the document level 'fullscreenchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onFullscreenChange( event ) {\n\n\t\tlet element = document.fullscreenElement || document.webkitFullscreenElement;\n\t\tif( element === dom.wrapper ) {\n\t\t\tevent.stopImmediatePropagation();\n\n\t\t\t// Timeout to avoid layout shift in Safari\n\t\t\tsetTimeout( () => {\n\t\t\t\tReveal.layout();\n\t\t\t\tReveal.focus.focus(); // focus.focus :'(\n\t\t\t}, 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles click on the auto-sliding controls element.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onAutoSlidePlayerClick( event ) {\n\n\t\t// Replay\n\t\tif( isLastSlide() && config.loop === false ) {\n\t\t\tslide( 0, 0 );\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Resume\n\t\telse if( autoSlidePaused ) {\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Pause\n\t\telse {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ------------------------------- API --------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t// The public reveal.js API\n\tconst API = {\n\t\tVERSION,\n\n\t\tinitialize,\n\t\tconfigure,\n\t\tdestroy,\n\n\t\tsync,\n\t\tsyncSlide,\n\t\tsyncFragments: fragments.sync.bind( fragments ),\n\n\t\t// Navigation methods\n\t\tslide,\n\t\tleft: navigateLeft,\n\t\tright: navigateRight,\n\t\tup: navigateUp,\n\t\tdown: navigateDown,\n\t\tprev: navigatePrev,\n\t\tnext: navigateNext,\n\n\t\t// Navigation aliases\n\t\tnavigateLeft, navigateRight, navigateUp, navigateDown, navigatePrev, navigateNext,\n\n\t\t// Fragment methods\n\t\tnavigateFragment: fragments.goto.bind( fragments ),\n\t\tprevFragment: fragments.prev.bind( fragments ),\n\t\tnextFragment: fragments.next.bind( fragments ),\n\n\t\t// Event binding\n\t\ton,\n\t\toff,\n\n\t\t// Legacy event binding methods left in for backwards compatibility\n\t\taddEventListener: on,\n\t\tremoveEventListener: off,\n\n\t\t// Forces an update in slide layout\n\t\tlayout,\n\n\t\t// Randomizes the order of slides\n\t\tshuffle,\n\n\t\t// Returns an object with the available routes as booleans (left/right/top/bottom)\n\t\tavailableRoutes,\n\n\t\t// Returns an object with the available fragments as booleans (prev/next)\n\t\tavailableFragments: fragments.availableRoutes.bind( fragments ),\n\n\t\t// Toggles a help overlay with keyboard shortcuts\n\t\ttoggleHelp: overlay.toggleHelp.bind( overlay ),\n\n\t\t// Toggles the overview mode on/off\n\t\ttoggleOverview: overview.toggle.bind( overview ),\n\n\t\t// Toggles the scroll view on/off\n\t\ttoggleScrollView: scrollView.toggle.bind( scrollView ),\n\n\t\t// Toggles the \"black screen\" mode on/off\n\t\ttogglePause,\n\n\t\t// Toggles the auto slide mode on/off\n\t\ttoggleAutoSlide,\n\n\t\t// Toggles visibility of the jump-to-slide UI\n\t\ttoggleJumpToSlide,\n\n\t\t// Slide navigation checks\n\t\tisFirstSlide,\n\t\tisLastSlide,\n\t\tisLastVerticalSlide,\n\t\tisVerticalSlide,\n\t\tisVerticalStack,\n\n\t\t// State checks\n\t\tisPaused,\n\t\tisAutoSliding,\n\t\tisSpeakerNotes: notes.isSpeakerNotesWindow.bind( notes ),\n\t\tisOverview: overview.isActive.bind( overview ),\n\t\tisFocused: focus.isFocused.bind( focus ),\n\t\tisOverlayOpen: overlay.isOpen.bind( overlay ),\n\t\tisScrollView: scrollView.isActive.bind( scrollView ),\n\t\tisPrintView: printView.isActive.bind( printView ),\n\n\t\t// Checks if reveal.js has been loaded and is ready for use\n\t\tisReady: () => ready,\n\n\t\t// Slide preloading\n\t\tloadSlide: slideContent.load.bind( slideContent ),\n\t\tunloadSlide: slideContent.unload.bind( slideContent ),\n\n\t\t// Start/stop all media inside of the current slide\n\t\tstartEmbeddedContent: () => slideContent.startEmbeddedContent( currentSlide ),\n\t\tstopEmbeddedContent: () => slideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } ),\n\n\t\t// Lightbox previews\n\t\tpreviewIframe: overlay.previewIframe.bind( overlay ),\n\t\tpreviewImage: overlay.previewImage.bind( overlay ),\n\t\tpreviewVideo: overlay.previewVideo.bind( overlay ),\n\n\t\tshowPreview: overlay.previewIframe.bind( overlay ), // deprecated in favor of showIframeLightbox\n\t\thidePreview: overlay.close.bind( overlay ),\n\n\t\t// Adds or removes all internal event listeners\n\t\taddEventListeners,\n\t\tremoveEventListeners,\n\t\tdispatchEvent,\n\n\t\t// Facility for persisting and restoring the presentation state\n\t\tgetState,\n\t\tsetState,\n\n\t\t// Presentation progress on range of 0-1\n\t\tgetProgress,\n\n\t\t// Returns the indices of the current, or specified, slide\n\t\tgetIndices,\n\n\t\t// Returns an Array of key:value maps of the attributes of each\n\t\t// slide in the deck\n\t\tgetSlidesAttributes,\n\n\t\t// Returns the number of slides that we have passed\n\t\tgetSlidePastCount,\n\n\t\t// Returns the total number of slides\n\t\tgetTotalSlides,\n\n\t\t// Returns the slide element at the specified index\n\t\tgetSlide,\n\n\t\t// Returns the previous slide element, may be null\n\t\tgetPreviousSlide: () => previousSlide,\n\n\t\t// Returns the current slide element\n\t\tgetCurrentSlide: () => currentSlide,\n\n\t\t// Returns the slide background element at the specified index\n\t\tgetSlideBackground,\n\n\t\t// Returns the speaker notes string for a slide, or null\n\t\tgetSlideNotes: notes.getSlideNotes.bind( notes ),\n\n\t\t// Returns an Array of all slides\n\t\tgetSlides,\n\n\t\t// Returns an array with all horizontal/vertical slides in the deck\n\t\tgetHorizontalSlides,\n\t\tgetVerticalSlides,\n\n\t\t// Checks if the presentation contains two or more horizontal\n\t\t// and vertical slides\n\t\thasHorizontalSlides,\n\t\thasVerticalSlides,\n\n\t\t// Checks if the deck has navigated on either axis at least once\n\t\thasNavigatedHorizontally: () => navigationHistory.hasNavigatedHorizontally,\n\t\thasNavigatedVertically: () => navigationHistory.hasNavigatedVertically,\n\n\t\tshouldAutoAnimateBetween,\n\n\t\t// Adds/removes a custom key binding\n\t\taddKeyBinding: keyboard.addKeyBinding.bind( keyboard ),\n\t\tremoveKeyBinding: keyboard.removeKeyBinding.bind( keyboard ),\n\n\t\t// Programmatically triggers a keyboard event\n\t\ttriggerKey: keyboard.triggerKey.bind( keyboard ),\n\n\t\t// Registers a new shortcut to include in the help overlay\n\t\tregisterKeyboardShortcut: keyboard.registerKeyboardShortcut.bind( keyboard ),\n\n\t\tgetComputedSlideSize,\n\t\tsetCurrentScrollPage,\n\n\t\t// Returns the current scale of the presentation content\n\t\tgetScale: () => scale,\n\n\t\t// Returns the current configuration object\n\t\tgetConfig: () => config,\n\n\t\t// Helper method, retrieves query string as a key:value map\n\t\tgetQueryHash: Util.getQueryHash,\n\n\t\t// Returns the path to the current slide as represented in the URL\n\t\tgetSlidePath: location.getHash.bind( location ),\n\n\t\t// Returns reveal.js DOM elements\n\t\tgetRevealElement: () => revealElement,\n\t\tgetSlidesElement: () => dom.slides,\n\t\tgetViewportElement: () => dom.viewport,\n\t\tgetBackgroundsElement: () => backgrounds.element,\n\n\t\t// API for registering and retrieving plugins\n\t\tregisterPlugin: plugins.registerPlugin.bind( plugins ),\n\t\thasPlugin: plugins.hasPlugin.bind( plugins ),\n\t\tgetPlugin: plugins.getPlugin.bind( plugins ),\n\t\tgetPlugins: plugins.getRegisteredPlugins.bind( plugins )\n\n\t};\n\n\t// Our internal API which controllers have access to\n\tUtil.extend( Reveal, {\n\t\t...API,\n\n\t\t// Methods for announcing content to screen readers\n\t\tannounceStatus,\n\t\tgetStatusText,\n\n\t\t// Controllers\n\t\tfocus,\n\t\tscroll: scrollView,\n\t\tprogress,\n\t\tcontrols,\n\t\tlocation,\n\t\toverview,\n\t\tkeyboard,\n\t\tfragments,\n\t\tbackgrounds,\n\t\tslideContent,\n\t\tslideNumber,\n\n\t\tonUserInput,\n\t\tcloseOverlay: overlay.close.bind( overlay ),\n\t\tupdateSlidesVisibility,\n\t\tlayoutSlideContents,\n\t\ttransformSlides,\n\t\tcueAutoSlide,\n\t\tcancelAutoSlide\n\t} );\n\n\treturn API;\n\n};\n","import Deck, { VERSION } from './reveal.js'\n\n/**\n * Expose the Reveal class to the window. To create a\n * new instance:\n * let deck = new Reveal( document.querySelector( '.reveal' ), {\n * controls: false\n * } );\n * deck.initialize().then(() => {\n * // reveal.js is ready\n * });\n */\nlet Reveal = Deck;\n\n\n/**\n * The below is a thin shell that mimics the pre 4.0\n * reveal.js API and ensures backwards compatibility.\n * This API only allows for one Reveal instance per\n * page, whereas the new API above lets you run many\n * presentations on the same page.\n *\n * Reveal.initialize( { controls: false } ).then(() => {\n * // reveal.js is ready\n * });\n */\n\nlet enqueuedAPICalls = [];\n\nReveal.initialize = options => {\n\n\t// Create our singleton reveal.js instance\n\tObject.assign( Reveal, new Deck( document.querySelector( '.reveal' ), options ) );\n\n\t// Invoke any enqueued API calls\n\tenqueuedAPICalls.map( method => method( Reveal ) );\n\n\treturn Reveal.initialize();\n\n}\n\n/**\n * The pre 4.0 API let you add event listener before\n * initializing. We maintain the same behavior by\n * queuing up premature API calls and invoking all\n * of them when Reveal.initialize is called.\n */\n[ 'configure', 'on', 'off', 'addEventListener', 'removeEventListener', 'registerPlugin' ].forEach( method => {\n\tReveal[method] = ( ...args ) => {\n\t\tenqueuedAPICalls.push( deck => deck[method].call( null, ...args ) );\n\t}\n} );\n\nReveal.isReady = () => false;\n\nReveal.VERSION = VERSION;\n\nexport default Reveal;"],"names":["extend","a","b","i","queryAll","el","selector","Array","from","querySelectorAll","toggleClass","className","value","classList","add","remove","deserialize","match","parseFloat","transformElement","element","transform","style","matches","target","matchesMethod","matchesSelector","msMatchesSelector","call","closest","parentNode","enterFullscreen","requestMethod","document","documentElement","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","apply","createStyleSheet","tag","createElement","type","length","styleSheet","cssText","appendChild","createTextNode","head","getQueryHash","query","location","search","replace","split","shift","pop","unescape","fileExtensionToMimeMap","mp4","m4a","ogv","mpeg","webm","UA","navigator","userAgent","isMobile","test","platform","maxTouchPoints","isAndroid","e","t","slice","o","l","u","cancelAnimationFrame","requestAnimationFrame","s","filter","dirty","active","c","forEach","styleComputed","m","y","v","p","d","f","S","availableWidth","clientWidth","currentWidth","scrollWidth","previousFontSize","currentFontSize","Math","min","max","minSize","maxSize","whiteSpace","multiLine","n","getComputedStyle","getPropertyValue","display","preStyleTestCompleted","fontSize","dispatchEvent","CustomEvent","detail","oldValue","newValue","scaleFactor","h","w","observeMutations","observer","disconnect","originalStyle","z","F","MutationObserver","observe","g","subtree","childList","characterData","W","E","clearTimeout","setTimeout","x","observeWindowDelay","M","Object","defineProperty","set","concat","observeWindow","fitAll","C","assign","map","newbie","push","fit","unfreeze","freeze","unsubscribe","arguments","window","SlideContent","allowedToPlay","constructor","Reveal","this","startEmbeddedIframe","bind","ensureMobileMediaPlaying","shouldPreload","isScrollView","preload","getConfig","preloadIframes","hasAttribute","load","slide","options","displayValue","includes","trim","setProperty","tagName","setAttribute","getAttribute","removeAttribute","media","sources","source","background","slideBackgroundElement","backgroundContent","slideBackgroundContentElement","backgroundIframe","backgroundImage","backgroundVideo","backgroundVideoLoop","backgroundVideoMuted","encodeRFC3986URI","url","encodeURI","charCodeAt","toString","toUpperCase","decodeURI","join","video","isSpeakerNotes","muted","sourceElement","getMimeTypeFromFile","filename","excludeIframes","iframe","width","height","maxHeight","maxWidth","backgroundIframeElement","querySelector","layout","scopeElement","fitty","unload","getSlideBackground","formatEmbeddedContent","_appendParamToIframeSource","sourceAttribute","sourceURL","param","getSlidesElement","src","indexOf","startEmbeddedContent","isSpeakerNotesWindow","autoplay","autoPlayMedia","play","readyState","startEmbeddedMedia","promise","addEventListener","catch","controls","then","removeEventListener","event","getVideoPlaybackQuality","playing","paused","totalFrames","totalVideoFrames","isAttachedToDOM","isVisible","ended","currentTime","error","name","contentWindow","postMessage","stopEmbeddedContent","unloadIframes","pause","isNotAllowedToPlay","SLIDES_SELECTOR","HORIZONTAL_SLIDES_SELECTOR","VERTICAL_SLIDES_SELECTOR","POST_MESSAGE_METHOD_BLACKLIST","SlideNumber","render","getRevealElement","configure","config","oldConfig","slideNumberDisplay","slideNumber","isPrintView","showSlideNumber","update","innerHTML","getSlideNumber","getCurrentSlide","format","getHorizontalSlides","horizontalOffset","dataset","visibility","getSlidePastCount","getTotalSlides","indices","getIndices","sep","isVerticalSlide","getHash","formatNumber","delimiter","isNaN","destroy","JumpToSlide","onInput","onBlur","onKeyDown","jumpInput","placeholder","show","indicesOnShow","focus","hide","jumpTimeout","jump","slideNumberFormat","getSlides","parseInt","getIndicesFromHash","oneBasedIndex","jumpAfter","delay","regex","RegExp","find","innerText","cancel","confirm","keyCode","stopImmediatePropagation","colorToRgb","color","hex3","r","charAt","hex6","rgb","rgba","Backgrounds","create","slideh","backgroundStack","createBackground","slidev","parallaxBackgroundImage","backgroundSize","parallaxBackgroundSize","backgroundRepeat","parallaxBackgroundRepeat","backgroundPosition","parallaxBackgroundPosition","container","contentElement","sync","data","backgroundColor","backgroundGradient","backgroundTransition","backgroundOpacity","dataPreload","opacity","contrastClass","getContrastClass","contrastColor","computedBackgroundStyle","bubbleSlideContrastClassToElement","classToBubble","contains","includeAll","currentSlide","currentBackground","horizontalPast","rtl","horizontalFuture","childNodes","backgroundh","backgroundv","indexv","previousBackground","previousBackgroundHash","currentBackgroundHash","currentVideo","previousVideo","currentVideoParent","backgroundChanged","slideContent","currentBackgroundContent","backgroundImageURL","updateParallax","backgroundWidth","backgroundHeight","horizontalSlides","verticalSlides","getVerticalSlides","horizontalOffsetMultiplier","slideWidth","offsetWidth","horizontalSlideCount","parallaxBackgroundHorizontal","verticalOffsetMultiplier","verticalOffset","slideHeight","offsetHeight","verticalSlideCount","parallaxBackgroundVertical","autoAnimateCounter","AutoAnimate","run","fromSlide","toSlide","reset","allSlides","toSlideIndex","fromSlideIndex","autoAnimateStyleSheet","animationOptions","getAutoAnimateOptions","autoAnimate","slideDirection","fromSlideIsHidden","css","getAutoAnimatableElements","elements","autoAnimateElements","to","autoAnimateUnmatched","defaultUnmatchedDuration","duration","defaultUnmatchedDelay","getUnmatchedAutoAnimateElements","unmatchedElement","unmatchedOptions","id","autoAnimateTarget","fontWeight","sheet","removeChild","elementOptions","easing","fromProps","getAutoAnimatableProperties","toProps","styles","translate","scale","presentationScale","getScale","delta","scaleX","scaleY","round","propertyName","toValue","fromValue","explicitValue","toStyleProperties","keys","inheritedOptions","autoAnimateEasing","autoAnimateDuration","autoAnimatedParent","autoAnimateDelay","direction","properties","bounds","measure","center","getBoundingClientRect","offsetLeft","offsetTop","computedStyles","autoAnimateStyles","property","pairs","autoAnimateMatcher","getAutoAnimatePairs","reserved","pair","index","textNodes","findAutoAnimateMatches","node","nodeName","textContent","getLocalBoundingBox","fromScope","toScope","serializer","fromMatches","toMatches","key","fromElement","primaryIndex","secondaryIndex","rootElement","children","reduce","result","containsAnimatedElements","ScrollView","activatedCallbacks","onScroll","activate","stateBeforeActivation","getState","slideHTMLBeforeActivation","horizontalBackgrounds","presentationBackground","viewportElement","viewportStyles","pageElements","pageContainer","previousSlide","createPageElement","isVertical","contentContainer","shouldAutoAnimateBetween","page","slideBackground","pageBackground","stickyContainer","insertBefore","horizontalSlide","isVerticalStack","verticalSlide","createProgressBar","stack","setState","callback","restoreScrollPosition","passive","deactivate","stateBeforeDeactivation","removeProgressBar","toggle","override","isActive","progressBar","progressBarInner","progressBarPlayhead","firstChild","handleDocumentMouseMove","progress","clientY","top","progressBarHeight","scrollTop","scrollHeight","handleDocumentMouseUp","draggingProgressBar","showProgressBar","preventDefault","syncPages","syncScrollPosition","slideSize","getComputedSlideSize","innerWidth","innerHeight","useCompactLayout","scrollLayout","viewportHeight","compactHeight","pageHeight","scrollTriggerHeight","scrollSnapType","scrollSnap","slideTriggers","pages","pageElement","createPage","slideElement","stickyElement","backgroundElement","autoAnimatePages","activatePage","deactivatePage","createFragmentTriggersForPage","createAutoAnimateTriggersForPage","totalScrollTriggerCount","scrollTriggers","total","triggerStick","scrollSnapAlign","marginTop","removeProperty","scrollPadding","totalHeight","position","setTriggerRanges","scrollProgress","syncProgressBar","trigger","rangeStart","range","scrollTriggerSegmentSize","scrollTrigger","fragmentGroups","fragments","sort","autoAnimateElement","autoAnimatePage","indexh","viewportHeightFactor","playheadHeight","progressBarScrollableHeight","progressSegmentHeight","spacing","slideTrigger","progressBarSlide","scrollTriggerElements","triggerElement","scrollProgressMid","activePage","loaded","activateTrigger","deactivateTrigger","setProgressBarValue","getAllPages","hideProgressBarTimeout","prev","next","scrollToSlide","getScrollTriggerBySlide","storeScrollPosition","storeScrollPositionTimeout","sessionStorage","setItem","origin","pathname","scrollPosition","getItem","scrollOrigin","setCurrentScrollPage","backgrounds","sibling","getSlideByIndices","flatMap","getViewportElement","PrintView","slides","injectPageNumbers","pageWidth","floor","margin","Promise","body","layoutSlideContents","slideScrollHeights","left","contentHeight","numberOfPages","ceil","pdfMaxPagesPerSlide","pdfPageHeightOffset","showNotes","notes","getSlideNotes","notesSpacing","notesLayout","notesElement","bottom","numberElement","pdfSeparateFragments","previousFragmentStep","fragment","clonedPage","cloneNode","fragmentNumber","view","Fragments","disable","enable","availableRoutes","hiddenFragments","grouped","ordered","unordered","sorted","group","sortAll","changedFragments","shown","hidden","maxIndex","currentFragment","wasVisible","announceStatus","getStatusText","bubbles","goto","offset","lastVisibleFragment","fragmentInURL","writeURL","Overview","onSlideClicked","overview","cancelAutoSlide","getBackgroundsElement","overviewSlideWidth","overviewSlideHeight","updateSlidesVisibility","hslide","vslide","hbackground","vbackground","vmin","transformSlides","cueAutoSlide","Keyboard","shortcuts","bindings","onDocumentKeyDown","navigationMode","unbind","addKeyBinding","binding","description","removeKeyBinding","triggerKey","registerKeyboardShortcut","getShortcuts","getBindings","keyboardCondition","isFocused","autoSlideWasPaused","isAutoSliding","onUserInput","activeElementIsCE","activeElement","isContentEditable","activeElementIsInput","activeElementIsNotes","unusedModifier","shiftKey","altKey","ctrlKey","metaKey","resumeKeyCodes","keyboard","isOverlayOpen","isPaused","useLinearMode","hasHorizontalSlides","hasVerticalSlides","triggered","action","skipFragments","right","undefined","up","Number","MAX_VALUE","down","togglePause","embedded","autoSlideStoppable","toggleAutoSlide","jumpToSlide","toggleJumpToSlide","closeOverlay","toggleHelp","Location","MAX_REPLACE_STATE_FREQUENCY","writeURLTimeout","replaceStateTimestamp","onWindowHashChange","hash","bits","hashIndexBase","hashOneBasedIndex","getElementById","decodeURIComponent","readURL","currentIndices","newIndices","history","debouncedReplaceState","replaceState","Date","now","replaceStateTimeout","encodeURIComponent","Controls","onNavigateLeftClicked","onNavigateRightClicked","onNavigateUpClicked","onNavigateDownClicked","onNavigatePrevClicked","onNavigateNextClicked","onEnterFullscreen","revealElement","controlsLeft","controlsRight","controlsUp","controlsDown","controlsPrev","controlsNext","controlsFullscreen","controlsRightArrow","controlsLeftArrow","controlsDownArrow","controlsLayout","controlsBackArrows","pointerEvents","eventName","routes","fragmentsRoutes","hasVerticalSiblings","parentElement","controlsTutorial","hasNavigatedVertically","hasNavigatedHorizontally","viewport","Progress","onProgressClicked","bar","getProgress","getMaxWidth","slidesTotal","slideIndex","clientX","targetIndices","Pointer","lastMouseWheelStep","cursorHidden","cursorInactiveTimeout","onDocumentCursorActive","onDocumentMouseScroll","mouseWheel","hideInactiveCursor","showCursor","cursor","hideCursor","hideCursorTime","wheelDelta","loadScript","script","async","defer","onload","onreadystatechange","onerror","err","Error","lastChild","Plugins","reveal","state","registeredPlugins","asyncDependencies","plugins","dependencies","registerPlugin","resolve","scripts","scriptsToLoad","condition","scriptLoadedCallback","initPlugins","console","warn","pluginValues","values","pluginsToInitialize","loadAsync","initNextPlugin","afterPlugInitialized","plugin","init","hasPlugin","getPlugin","getRegisteredPlugins","Overlay","onSlidesClicked","iframeTriggerSelector","mediaTriggerSelector","stateProps","previewLinks","hasLinkPreviews","hasMediaPreviews","createOverlay","dom","previewIframe","close","previewMedia","mediaType","fitMode","previewFit","previewImage","img","previewVideo","previewAutoplay","previewControls","loop","previewLoop","previewMuted","playsInline","showHelp","help","html","isOpen","every","linkTarget","mediaTarget","Touch","touchStartX","touchStartY","touchStartCount","touchCaptured","onPointerDown","onPointerMove","onPointerUp","onTouchStart","onTouchMove","onTouchEnd","msPointerEnabled","isSwipePrevented","touches","currentX","currentY","includeFragments","deltaX","deltaY","abs","pointerType","MSPOINTER_TYPE_TOUCH","STATE_FOCUS","STATE_BLUR","Focus","onRevealPointerDown","onDocumentPointerDown","blur","Notes","updateVisibility","hasNotes","notesElements","Playback","progressCheck","diameter","diameter2","thickness","progressOffset","canvas","context","getContext","setPlaying","wasPlaying","animate","progressBefore","radius","iconSize","endAngle","PI","startAngle","save","clearRect","beginPath","arc","fillStyle","fill","lineWidth","strokeStyle","stroke","fillRect","moveTo","lineTo","restore","on","listener","off","defaultConfig","minScale","maxScale","respondToHashChanges","disableLayout","touch","shuffle","showHiddenSlides","autoSlide","autoSlideMethod","defaultTiming","postMessageEvents","focusBodyOnPageVisibilityChange","transition","transitionSpeed","scrollActivationWidth","POSITIVE_INFINITY","viewDistance","mobileViewDistance","sortFragmentsOnSync","VERSION","Deck","autoSlidePlayer","initialized","ready","navigationHistory","slidesTransform","autoSlideTimeout","autoSlideStartTime","autoSlidePaused","scrollView","printView","pointer","overlay","start","Util","wrapper","parent","childElementCount","Device","pauseOverlay","createSingletonNode","tagname","classname","nodes","testNode","statusElement","overflow","clip","createStatusElement","setupDOM","onPostMessage","setInterval","scrollLeft","onFullscreenChange","activatePrintView","activateScrollView","removeEventListeners","activateInitialView","text","nodeType","isAriaHidden","isDisplayHidden","altText","ensurePunctuation","child","trimmedText","isReady","numberOfSlides","resume","onAutoSlidePlayerClick","addEventListeners","onWindowResize","onTransitionEnd","onPageVisibilityChange","useCapture","transforms","createEvent","initEvent","dispatchPostMessage","dispatchSlideChanged","self","message","namespace","JSON","stringify","viewportWidth","size","oldScale","presentationWidth","presentationHeight","zoom","len","checkResponsiveScrollView","remainingHeight","getRemainingHeight","newHeight","oldHeight","nw","naturalWidth","videoWidth","nh","naturalHeight","videoHeight","es","setPreviousVerticalIndex","getPreviousVerticalIndex","attributeName","isLastVerticalSlide","nextElementSibling","isFirstSlide","isLastSlide","wasPaused","defaultPrevented","stateBefore","indexhBefore","indexvBefore","updateSlides","slideChanged","currentHorizontalSlide","currentVerticalSlides","autoAnimateTransition","stateLoop","j","splice","beforeSlide","random","slidesLength","printMode","loopedForwards","loopedBackwards","reverse","showFragmentsIn","hideFragmentsIn","wasPresent","slideState","distanceX","distanceY","horizontalSlidesLength","isOverview","verticalSlidesLength","oy","fragmentRoutes","pastCount","mainLoop","getSlide","indexf","fragmentAutoSlide","parentAutoSlide","slideAutoSlide","playbackRate","navigateNext","pauseAutoSlide","resumeAutoSlide","navigateLeft","navigateRight","navigateUp","navigateDown","navigatePrev","parse","method","args","anchor","fullscreenElement","webkitFullscreenElement","API","initialize","initOptions","setViewport","syncSlide","syncFragments","navigateFragment","prevFragment","nextFragment","availableFragments","toggleOverview","toggleScrollView","loadSlide","unloadSlide","showPreview","hidePreview","pausedFlag","overviewFlag","totalCount","allFragments","fragmentWeight","getSlidesAttributes","attributes","attribute","getPreviousSlide","getSlidePath","getPlugins","scroll","enqueuedAPICalls","deck"],"mappings":"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","x_google_ignoreList":[2]}
\ No newline at end of file
+{"version":3,"file":"reveal.js","sources":["../js/utils/util.js","../js/utils/device.js","../node_modules/fitty/dist/fitty.module.js","../js/controllers/slidecontent.js","../js/utils/constants.js","../js/controllers/slidenumber.js","../js/controllers/jumptoslide.js","../js/utils/color.js","../js/controllers/backgrounds.js","../js/controllers/autoanimate.js","../js/controllers/scrollview.js","../js/controllers/printview.js","../js/controllers/fragments.js","../js/controllers/overview.js","../js/controllers/keyboard.js","../js/controllers/location.js","../js/controllers/controls.js","../js/controllers/progress.js","../js/controllers/pointer.js","../js/utils/loader.js","../js/controllers/plugins.js","../js/controllers/overlay.js","../js/controllers/touch.js","../js/controllers/focus.js","../js/controllers/notes.js","../js/components/playback.js","../js/config.js","../js/reveal.js","../js/index.js"],"sourcesContent":["/**\n * Extend object a with the properties of object b.\n * If there's a conflict, object b takes precedence.\n *\n * @param {object} a\n * @param {object} b\n */\nexport const extend = ( a, b ) => {\n\n\tfor( let i in b ) {\n\t\ta[ i ] = b[ i ];\n\t}\n\n\treturn a;\n\n}\n\n/**\n * querySelectorAll but returns an Array.\n */\nexport const queryAll = ( el, selector ) => {\n\n\treturn Array.from( el.querySelectorAll( selector ) );\n\n}\n\n/**\n * classList.toggle() with cross browser support\n */\nexport const toggleClass = ( el, className, value ) => {\n\tif( value ) {\n\t\tel.classList.add( className );\n\t}\n\telse {\n\t\tel.classList.remove( className );\n\t}\n}\n\n/**\n * Utility for deserializing a value.\n *\n * @param {*} value\n * @return {*}\n */\nexport const deserialize = ( value ) => {\n\n\tif( typeof value === 'string' ) {\n\t\tif( value === 'null' ) return null;\n\t\telse if( value === 'true' ) return true;\n\t\telse if( value === 'false' ) return false;\n\t\telse if( value.match( /^-?[\\d\\.]+$/ ) ) return parseFloat( value );\n\t}\n\n\treturn value;\n\n}\n\n/**\n * Measures the distance in pixels between point a\n * and point b.\n *\n * @param {object} a point with x/y properties\n * @param {object} b point with x/y properties\n *\n * @return {number}\n */\nexport const distanceBetween = ( a, b ) => {\n\n\tlet dx = a.x - b.x,\n\t\tdy = a.y - b.y;\n\n\treturn Math.sqrt( dx*dx + dy*dy );\n\n}\n\n/**\n * Applies a CSS transform to the target element.\n *\n * @param {HTMLElement} element\n * @param {string} transform\n */\nexport const transformElement = ( element, transform ) => {\n\n\telement.style.transform = transform;\n\n}\n\n/**\n * Element.matches with IE support.\n *\n * @param {HTMLElement} target The element to match\n * @param {String} selector The CSS selector to match\n * the element against\n *\n * @return {Boolean}\n */\nexport const matches = ( target, selector ) => {\n\n\tlet matchesMethod = target.matches || target.matchesSelector || target.msMatchesSelector;\n\n\treturn !!( matchesMethod && matchesMethod.call( target, selector ) );\n\n}\n\n/**\n * Find the closest parent that matches the given\n * selector.\n *\n * @param {HTMLElement} target The child element\n * @param {String} selector The CSS selector to match\n * the parents against\n *\n * @return {HTMLElement} The matched parent or null\n * if no matching parent was found\n */\nexport const closest = ( target, selector ) => {\n\n\t// Native Element.closest\n\tif( typeof target.closest === 'function' ) {\n\t\treturn target.closest( selector );\n\t}\n\n\t// Polyfill\n\twhile( target ) {\n\t\tif( matches( target, selector ) ) {\n\t\t\treturn target;\n\t\t}\n\n\t\t// Keep searching\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Handling the fullscreen functionality via the fullscreen API\n *\n * @see http://fullscreen.spec.whatwg.org/\n * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode\n */\nexport const enterFullscreen = element => {\n\n\telement = element || document.documentElement;\n\n\t// Check which implementation is available\n\tlet requestMethod = element.requestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullScreen ||\n\t\t\t\t\t\telement.mozRequestFullScreen ||\n\t\t\t\t\t\telement.msRequestFullscreen;\n\n\tif( requestMethod ) {\n\t\trequestMethod.apply( element );\n\t}\n\n}\n\n/**\n * Creates an HTML element and returns a reference to it.\n * If the element already exists the existing instance will\n * be returned.\n *\n * @param {HTMLElement} container\n * @param {string} tagname\n * @param {string} classname\n * @param {string} innerHTML\n *\n * @return {HTMLElement}\n */\nexport const createSingletonNode = ( container, tagname, classname, innerHTML='' ) => {\n\n\t// Find all nodes matching the description\n\tlet nodes = container.querySelectorAll( '.' + classname );\n\n\t// Check all matches to find one which is a direct child of\n\t// the specified container\n\tfor( let i = 0; i < nodes.length; i++ ) {\n\t\tlet testNode = nodes[i];\n\t\tif( testNode.parentNode === container ) {\n\t\t\treturn testNode;\n\t\t}\n\t}\n\n\t// If no node was found, create it now\n\tlet node = document.createElement( tagname );\n\tnode.className = classname;\n\tnode.innerHTML = innerHTML;\n\tcontainer.appendChild( node );\n\n\treturn node;\n\n}\n\n/**\n * Injects the given CSS styles into the DOM.\n *\n * @param {string} value\n */\nexport const createStyleSheet = ( value ) => {\n\n\tlet tag = document.createElement( 'style' );\n\ttag.type = 'text/css';\n\n\tif( value && value.length > 0 ) {\n\t\tif( tag.styleSheet ) {\n\t\t\ttag.styleSheet.cssText = value;\n\t\t}\n\t\telse {\n\t\t\ttag.appendChild( document.createTextNode( value ) );\n\t\t}\n\t}\n\n\tdocument.head.appendChild( tag );\n\n\treturn tag;\n\n}\n\n/**\n * Returns a key:value hash of all query params.\n */\nexport const getQueryHash = () => {\n\n\tlet query = {};\n\n\tlocation.search.replace( /[A-Z0-9]+?=([\\w\\.%-]*)/gi, a => {\n\t\tquery[ a.split( '=' ).shift() ] = a.split( '=' ).pop();\n\t} );\n\n\t// Basic deserialization\n\tfor( let i in query ) {\n\t\tlet value = query[ i ];\n\n\t\tquery[ i ] = deserialize( unescape( value ) );\n\t}\n\n\t// Do not accept new dependencies via query config to avoid\n\t// the potential of malicious script injection\n\tif( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];\n\n\treturn query;\n\n}\n\n/**\n * Returns the remaining height within the parent of the\n * target element.\n *\n * remaining height = [ configured parent height ] - [ current parent height ]\n *\n * @param {HTMLElement} element\n * @param {number} [height]\n */\nexport const getRemainingHeight = ( element, height = 0 ) => {\n\n\tif( element ) {\n\t\tlet newHeight, oldHeight = element.style.height;\n\n\t\t// Change the .stretch element height to 0 in order find the height of all\n\t\t// the other elements\n\t\telement.style.height = '0px';\n\n\t\t// In Overview mode, the parent (.slide) height is set of 700px.\n\t\t// Restore it temporarily to its natural height.\n\t\telement.parentNode.style.height = 'auto';\n\n\t\tnewHeight = height - element.parentNode.offsetHeight;\n\n\t\t// Restore the old height, just in case\n\t\telement.style.height = oldHeight + 'px';\n\n\t\t// Clear the parent (.slide) height. .removeProperty works in IE9+\n\t\telement.parentNode.style.removeProperty('height');\n\n\t\treturn newHeight;\n\t}\n\n\treturn height;\n\n}\n\nconst fileExtensionToMimeMap = {\n\t'mp4': 'video/mp4',\n\t'm4a': 'video/mp4',\n\t'ogv': 'video/ogg',\n\t'mpeg': 'video/mpeg',\n\t'webm': 'video/webm'\n}\n\n/**\n * Guess the MIME type for common file formats.\n */\nexport const getMimeTypeFromFile = ( filename='' ) => {\n\treturn fileExtensionToMimeMap[filename.split('.').pop()]\n}\n\n/**\n * Encodes a string for RFC3986-compliant URL format.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encoding_for_rfc3986\n *\n * @param {string} url\n */\nexport const encodeRFC3986URI = ( url='' ) => {\n\treturn encodeURI(url)\n\t .replace(/%5B/g, \"[\")\n\t .replace(/%5D/g, \"]\")\n\t .replace(\n\t\t/[!'()*]/g,\n\t\t(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n\t );\n}","const UA = navigator.userAgent;\n\nexport const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) ||\n\t\t\t\t\t\t( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS\n\nexport const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA );\n\nexport const isAndroid = /android/gi.test( UA );","/**\n * fitty v2.3.7 - Snugly resizes text to fit its parent container\n * Copyright (c) 2023 Rik Schennink
(https://pqina.nl/)\n */\n\nvar e=function(e){if(e){var t=function(e){return[].slice.call(e)},n=0,i=1,r=2,o=3,a=[],l=null,u=\"requestAnimationFrame\"in e?function(){e.cancelAnimationFrame(l),l=e.requestAnimationFrame((function(){return s(a.filter((function(e){return e.dirty&&e.active})))}))}:function(){},c=function(e){return function(){a.forEach((function(t){return t.dirty=e})),u()}},s=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=m(e)})),e.filter(y).forEach(v);var t=e.filter(p);t.forEach(d),t.forEach((function(e){v(e),f(e)})),t.forEach(S)},f=function(e){return e.dirty=n},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?\"normal\":\"nowrap\"},p=function(e){return e.dirty!==r||e.dirty===r&&e.element.parentNode.clientWidth!==e.availableWidth},m=function(t){var n=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(n.getPropertyValue(\"font-size\")),t.display=n.getPropertyValue(\"display\"),t.whiteSpace=n.getPropertyValue(\"white-space\"),!0},y=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display=\"inline-block\"),\"nowrap\"!==e.whiteSpace&&(t=!0,e.whiteSpace=\"nowrap\"),e.preStyleTestCompleted=!0,t)},v=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+\"px\"},S=function(e){e.element.dispatchEvent(new CustomEvent(\"fit\",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},h=function(e,t){return function(){e.dirty=t,e.active&&u()}},w=function(e){return function(){a=a.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},b=function(e){return function(){e.active||(e.active=!0,u())}},z=function(e){return function(){return e.active=!1}},F=function(e){e.observeMutations&&(e.observer=new MutationObserver(h(e,i)),e.observer.observe(e.element,e.observeMutations))},g={minSize:16,maxSize:512,multiLine:!0,observeMutations:\"MutationObserver\"in e&&{subtree:!0,childList:!0,characterData:!0}},W=null,E=function(){e.clearTimeout(W),W=e.setTimeout(c(r),x.observeWindowDelay)},M=[\"resize\",\"orientationchange\"];return Object.defineProperty(x,\"observeWindow\",{set:function(t){var n=\"\".concat(t?\"add\":\"remove\",\"EventListener\");M.forEach((function(t){e[n](t,E)}))}}),x.observeWindow=!0,x.observeWindowDelay=100,x.fitAll=c(o),x}function C(e,t){var n=Object.assign({},g,t),i=e.map((function(e){var t=Object.assign({},n,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},F(e),e.newbie=!0,e.dirty=!0,a.push(e)}(t),{element:e,fit:h(t,o),unfreeze:b(t),freeze:z(t),unsubscribe:w(t)}}));return u(),i}function x(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"string\"==typeof e?C(t(document.querySelectorAll(e)),n):C([e],n)[0]}}(\"undefined\"==typeof window?null:window);export default e;\n","import { extend, queryAll, closest, getMimeTypeFromFile, encodeRFC3986URI } from '../utils/util.js'\nimport { isMobile } from '../utils/device.js'\n\nimport fitty from 'fitty';\n\n/**\n * Handles loading, unloading and playback of slide\n * content such as images, videos and iframes.\n */\nexport default class SlideContent {\n\n\tallowedToPlay = true;\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );\n\t\tthis.ensureMobileMediaPlaying = this.ensureMobileMediaPlaying.bind( this );\n\n\t}\n\n\t/**\n\t * Should the given element be preloaded?\n\t * Decides based on local element attributes and global config.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tshouldPreload( element ) {\n\n\t\tif( this.Reveal.isScrollView() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prefer an explicit global preload setting\n\t\tlet preload = this.Reveal.getConfig().preloadIframes;\n\n\t\t// If no global setting is available, fall back on the element's\n\t\t// own preload setting\n\t\tif( typeof preload !== 'boolean' ) {\n\t\t\tpreload = element.hasAttribute( 'data-preload' );\n\t\t}\n\n\t\treturn preload;\n\t}\n\n\t/**\n\t * Called when the given slide is within the configured view\n\t * distance. Shows the slide element and loads any content\n\t * that is set to load lazily (data-src).\n\t *\n\t * @param {HTMLElement} slide Slide to show\n\t */\n\tload( slide, options = {} ) {\n\n\t\t// Show the slide element\n\t\tconst displayValue = this.Reveal.getConfig().display;\n\t\tif( displayValue.includes('!important') ) {\n\t\t\tconst value = displayValue.replace(/\\s*!important\\s*$/, '').trim();\n\t\t\tslide.style.setProperty('display', value, 'important');\n\t\t} else {\n\t\t\tslide.style.display = displayValue;\n\t\t}\n\n\t\t// Media elements with data-src attributes\n\t\tqueryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {\n\t\t\tif( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {\n\t\t\t\telement.setAttribute( 'src', element.getAttribute( 'data-src' ) );\n\t\t\t\telement.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\telement.removeAttribute( 'data-src' );\n\t\t\t}\n\t\t} );\n\n\t\t// Media elements with children\n\t\tqueryAll( slide, 'video, audio' ).forEach( media => {\n\t\t\tlet sources = 0;\n\n\t\t\tqueryAll( media, 'source[data-src]' ).forEach( source => {\n\t\t\t\tsource.setAttribute( 'src', source.getAttribute( 'data-src' ) );\n\t\t\t\tsource.removeAttribute( 'data-src' );\n\t\t\t\tsource.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\tsources += 1;\n\t\t\t} );\n\n\t\t\t// Enable inline video playback in mobile Safari\n\t\t\tif( isMobile && media.tagName === 'VIDEO' ) {\n\t\t\t\tmedia.setAttribute( 'playsinline', '' );\n\t\t\t}\n\n\t\t\t// If we rewrote sources for this video/audio element, we need\n\t\t\t// to manually tell it to load from its new origin\n\t\t\tif( sources > 0 ) {\n\t\t\t\tmedia.load();\n\t\t\t}\n\t\t} );\n\n\n\t\t// Show the corresponding background element\n\t\tlet background = slide.slideBackgroundElement;\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'block';\n\n\t\t\tlet backgroundContent = slide.slideBackgroundContentElement;\n\t\t\tlet backgroundIframe = slide.getAttribute( 'data-background-iframe' );\n\n\t\t\t// If the background contains media, load it\n\t\t\tif( background.hasAttribute( 'data-loaded' ) === false ) {\n\t\t\t\tbackground.setAttribute( 'data-loaded', 'true' );\n\n\t\t\t\tlet backgroundImage = slide.getAttribute( 'data-background-image' ),\n\t\t\t\t\tbackgroundVideo = slide.getAttribute( 'data-background-video' ),\n\t\t\t\t\tbackgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),\n\t\t\t\t\tbackgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );\n\n\t\t\t\t// Images\n\t\t\t\tif( backgroundImage ) {\n\t\t\t\t\t// base64\n\t\t\t\t\tif( /^data:/.test( backgroundImage.trim() ) ) {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = `url(${backgroundImage.trim()})`;\n\t\t\t\t\t}\n\t\t\t\t\t// URL(s)\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {\n\t\t\t\t\t\t\t// Decode URL(s) that are already encoded first\n\t\t\t\t\t\t\tlet decoded = decodeURI(background.trim());\n\t\t\t\t\t\t\treturn `url(${encodeRFC3986URI(decoded)})`;\n\t\t\t\t\t\t}).join( ',' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Videos\n\t\t\t\telse if ( backgroundVideo ) {\n\t\t\t\t\tlet video = document.createElement( 'video' );\n\n\t\t\t\t\tif( backgroundVideoLoop ) {\n\t\t\t\t\t\tvideo.setAttribute( 'loop', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( backgroundVideoMuted || this.Reveal.isSpeakerNotes() ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enable inline playback in mobile Safari\n\t\t\t\t\t//\n\t\t\t\t\t// Mute is required for video to play when using\n\t\t\t\t\t// swipe gestures to navigate since they don't\n\t\t\t\t\t// count as direct user actions :'(\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t\tvideo.setAttribute( 'playsinline', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support comma separated lists of video sources\n\t\t\t\t\tbackgroundVideo.split( ',' ).forEach( source => {\n\t\t\t\t\t\tconst sourceElement = document.createElement( 'source' );\n\t\t\t\t\t\tsourceElement.setAttribute( 'src', source );\n\n\t\t\t\t\t\tlet type = getMimeTypeFromFile( source );\n\t\t\t\t\t\tif( type ) {\n\t\t\t\t\t\t\tsourceElement.setAttribute( 'type', type );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvideo.appendChild( sourceElement );\n\t\t\t\t\t} );\n\n\t\t\t\t\tbackgroundContent.appendChild( video );\n\t\t\t\t}\n\t\t\t\t// Iframes\n\t\t\t\telse if( backgroundIframe && options.excludeIframes !== true ) {\n\t\t\t\t\tlet iframe = document.createElement( 'iframe' );\n\t\t\t\t\tiframe.setAttribute( 'allowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'mozallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'webkitallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'allow', 'autoplay' );\n\n\t\t\t\t\tiframe.setAttribute( 'data-src', backgroundIframe );\n\n\t\t\t\t\tiframe.style.width = '100%';\n\t\t\t\t\tiframe.style.height = '100%';\n\t\t\t\t\tiframe.style.maxHeight = '100%';\n\t\t\t\t\tiframe.style.maxWidth = '100%';\n\n\t\t\t\t\tbackgroundContent.appendChild( iframe );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start loading preloadable iframes\n\t\t\tlet backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );\n\t\t\tif( backgroundIframeElement ) {\n\n\t\t\t\t// Check if this iframe is eligible to be preloaded\n\t\t\t\tif( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {\n\t\t\t\t\tif( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {\n\t\t\t\t\t\tbackgroundIframeElement.setAttribute( 'src', backgroundIframe );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.layout( slide );\n\n\t}\n\n\t/**\n\t * Applies JS-dependent layout helpers for the scope.\n\t */\n\tlayout( scopeElement ) {\n\n\t\t// Autosize text with the r-fit-text class based on the\n\t\t// size of its container. This needs to happen after the\n\t\t// slide is visible in order to measure the text.\n\t\tArray.from( scopeElement.querySelectorAll( '.r-fit-text' ) ).forEach( element => {\n\t\t\tfitty( element, {\n\t\t\t\tminSize: 24,\n\t\t\t\tmaxSize: this.Reveal.getConfig().height * 0.8,\n\t\t\t\tobserveMutations: false,\n\t\t\t\tobserveWindow: false\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unloads and hides the given slide. This is called when the\n\t * slide is moved outside of the configured view distance.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tunload( slide ) {\n\n\t\t// Hide the slide element\n\t\tslide.style.display = 'none';\n\n\t\t// Hide the corresponding background element\n\t\tlet background = this.Reveal.getSlideBackground( slide );\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'none';\n\n\t\t\t// Unload any background iframes\n\t\t\tqueryAll( background, 'iframe[src]' ).forEach( element => {\n\t\t\t\telement.removeAttribute( 'src' );\n\t\t\t} );\n\t\t}\n\n\t\t// Reset lazy-loaded media elements with src attributes\n\t\tqueryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {\n\t\t\telement.setAttribute( 'data-src', element.getAttribute( 'src' ) );\n\t\t\telement.removeAttribute( 'src' );\n\t\t} );\n\n\t\t// Reset lazy-loaded media elements with children\n\t\tqueryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {\n\t\t\tsource.setAttribute( 'data-src', source.getAttribute( 'src' ) );\n\t\t\tsource.removeAttribute( 'src' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Enforces origin-specific format rules for embedded media.\n\t */\n\tformatEmbeddedContent() {\n\n\t\tlet _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {\n\t\t\tqueryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*=\"'+ sourceURL +'\"]' ).forEach( el => {\n\t\t\t\tlet src = el.getAttribute( sourceAttribute );\n\t\t\t\tif( src && src.indexOf( param ) === -1 ) {\n\t\t\t\t\tel.setAttribute( sourceAttribute, src + ( !/\\?/.test( src ) ? '?' : '&' ) + param );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// YouTube frames must include \"?enablejsapi=1\"\n\t\t_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );\n\n\t\t// Vimeo frames must include \"?api=1\"\n\t\t_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );\n\n\t}\n\n\t/**\n\t * Start playback of any embedded content inside of\n\t * the given element.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstartEmbeddedContent( element ) {\n\n\t\tif( element ) {\n\n\t\t\tconst isSpeakerNotesWindow = this.Reveal.isSpeakerNotes();\n\n\t\t\t// Restart GIFs\n\t\t\tqueryAll( element, 'img[src$=\".gif\"]' ).forEach( el => {\n\t\t\t\t// Setting the same unchanged source like this was confirmed\n\t\t\t\t// to work in Chrome, FF & Safari\n\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'src' ) );\n\t\t\t} );\n\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\tif( autoplay && typeof el.play === 'function' ) {\n\n\t\t\t\t\t// In the speaker view we only auto-play muted media\n\t\t\t\t\tif( isSpeakerNotesWindow && !el.muted ) return;\n\n\t\t\t\t\t// If the media is ready, start playback\n\t\t\t\t\tif( el.readyState > 1 ) {\n\t\t\t\t\t\tthis.startEmbeddedMedia( { target: el } );\n\t\t\t\t\t}\n\t\t\t\t\t// Mobile devices never fire a loaded event so instead\n\t\t\t\t\t// of waiting, we initiate playback\n\t\t\t\t\telse if( isMobile ) {\n\t\t\t\t\t\tlet promise = el.play();\n\n\t\t\t\t\t\tel.addEventListener( 'canplay', this.ensureMobileMediaPlaying );\n\n\t\t\t\t\t\t// If autoplay does not work, ensure that the controls are visible so\n\t\t\t\t\t\t// that the viewer can start the media on their own\n\t\t\t\t\t\tif( promise && typeof promise.catch === 'function' && el.controls === false ) {\n\t\t\t\t\t\t\tpromise\n\t\t\t\t\t\t\t.then( () => {\n\t\t\t\t\t\t\t\tthis.allowedToPlay = true;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch( () => {\n\t\t\t\t\t\t\t\tel.controls = true;\n\n\t\t\t\t\t\t\t\t// Once the video does start playing, hide the controls again\n\t\t\t\t\t\t\t\tel.addEventListener( 'play', () => {\n\t\t\t\t\t\t\t\t\tel.controls = false;\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// If the media isn't loaded, wait before playing\n\t\t\t\t\telse {\n\t\t\t\t\t\tel.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'loadeddata', this.startEmbeddedMedia );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Don't play iframe content in the speaker view since we can't\n\t\t\t// guarantee that it's muted\n\t\t\tif( !isSpeakerNotesWindow ) {\n\n\t\t\t\t// Normal iframes\n\t\t\t\tqueryAll( element, 'iframe[src]' ).forEach( el => {\n\t\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.startEmbeddedIframe( { target: el } );\n\t\t\t\t} );\n\n\t\t\t\t// Lazy loading iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {\n\t\t\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'data-src' ) );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensure that an HTMLMediaElement is playing on mobile devices.\n\t *\n\t * This is a workaround for a bug in mobile Safari where\n\t * the media fails to display if many videos are started\n\t * at the same moment. When this happens, Mobile Safari\n\t * reports the video is playing, and the current time\n\t * advances, but nothing is visible.\n\t *\n\t * @param {Event} event\n\t */\n\tensureMobileMediaPlaying( event ) {\n\n\t\tconst el = event.target;\n\n\t\t// Ignore this check incompatible browsers\n\t\tif( typeof el.getVideoPlaybackQuality !== 'function' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout( () => {\n\n\t\t\tconst playing = el.paused === false;\n\t\t\tconst totalFrames = el.getVideoPlaybackQuality().totalVideoFrames;\n\n\t\t\tif( playing && totalFrames === 0 ) {\n\t\t\t\tel.load();\n\t\t\t\tel.play();\n\t\t\t}\n\n\t\t}, 1000 );\n\n\t}\n\n\t/**\n\t * Starts playing an embedded video/audio element after\n\t * it has finished loading.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedMedia( event ) {\n\n\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\tif( isAttachedToDOM && isVisible ) {\n\t\t\t// Don't restart if media is already playing\n\t\t\tif( event.target.paused || event.target.ended ) {\n\t\t\t\tevent.target.currentTime = 0;\n\t\t\t\tconst promise = event.target.play();\n\n\t\t\t\tif( promise && typeof promise.catch === 'function' ) {\n\t\t\t\t\tpromise\n\t\t\t\t\t\t.then( () => {\n\t\t\t\t\t\t\tthis.allowedToPlay = true;\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t\t\tif( error.name === 'NotAllowedError' ) {\n\t\t\t\t\t\t\t\tthis.allowedToPlay = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tevent.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );\n\n\t}\n\n\t/**\n\t * \"Starts\" the content of an embedded iframe using the\n\t * postMessage API.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedIframe( event ) {\n\n\t\tlet iframe = event.target;\n\n\t\tif( this.Reveal.getConfig().preventIframeAutoFocus ) {\n\n\t\t\tlet elapsed = 0;\n\t\t\tconst interval = 100;\n\t\t\tconst maxTime = 1000;\n\t\t\tconst checkFocus = () => {\n\t\t\t\tif( document.activeElement === iframe ) {\n\t\t\t\t\tdocument.activeElement.blur();\n\t\t\t\t} else if( elapsed < maxTime ) {\n\t\t\t\t\telapsed += interval;\n\t\t\t\t\tsetTimeout( checkFocus, interval );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tsetTimeout( checkFocus, interval );\n\n\t\t}\n\n\t\tif( iframe && iframe.contentWindow ) {\n\n\t\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\t\tif( isAttachedToDOM && isVisible ) {\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\t// YouTube postMessage API\n\t\t\t\tif( /youtube\\.com\\/embed\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Vimeo postMessage API\n\t\t\t\telse if( /player\\.vimeo\\.com\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"method\":\"play\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Generic postMessage API\n\t\t\t\telse {\n\t\t\t\t\tiframe.contentWindow.postMessage( 'slide:start', '*' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stop playback of any embedded content inside of\n\t * the targeted slide.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstopEmbeddedContent( element, options = {} ) {\n\n\t\toptions = extend( {\n\t\t\t// Defaults\n\t\t\tunloadIframes: true\n\t\t}, options );\n\n\t\tif( element && element.parentNode ) {\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {\n\t\t\t\t\tel.setAttribute('data-paused-by-reveal', '');\n\t\t\t\t\tel.pause();\n\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tel.removeEventListener( 'canplay', this.ensureMobileMediaPlaying );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generic postMessage API for non-lazy loaded iframes\n\t\t\tqueryAll( element, 'iframe' ).forEach( el => {\n\t\t\t\tif( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );\n\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t});\n\n\t\t\t// YouTube postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"youtube.com/embed/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Vimeo postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"player.vimeo.com/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"method\":\"pause\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( options.unloadIframes === true ) {\n\t\t\t\t// Unload lazy-loaded iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\t// Only removing the src doesn't actually unload the frame\n\t\t\t\t\t// in all browsers (Firefox) so we set it to blank first\n\t\t\t\t\tel.setAttribute( 'src', 'about:blank' );\n\t\t\t\t\tel.removeAttribute( 'src' );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks whether media playback is blocked by the browser. This\n\t * typically happens when media playback is initiated without a\n\t * direct user interaction.\n\t */\n\tisNotAllowedToPlay() {\n\n\t\treturn !this.allowedToPlay;\n\n\t}\n\n}\n","\nexport const SLIDES_SELECTOR = '.slides section';\nexport const HORIZONTAL_SLIDES_SELECTOR = '.slides>section';\nexport const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section';\nexport const HORIZONTAL_BACKGROUNDS_SELECTOR = '.backgrounds>.slide-background';\n\n// Methods that may not be invoked via the postMessage API\nexport const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/;\n\n// Regex for retrieving the fragment style from a class attribute\nexport const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;\n\n// Slide number formats\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL = 'h.v';\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL = 'h/v';\nexport const SLIDE_NUMBER_FORMAT_CURRENT = 'c';\nexport const SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL = 'c/t';","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL\n} from \"../utils/constants\";\n\n/**\n * Handles the display of reveal.js' optional slide number.\n */\nexport default class SlideNumber {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'slide-number';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tlet slideNumberDisplay = 'none';\n\t\tif( config.slideNumber && !this.Reveal.isPrintView() ) {\n\t\t\tif( config.showSlideNumber === 'all' ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t\telse if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t}\n\n\t\tthis.element.style.display = slideNumberDisplay;\n\n\t}\n\n\t/**\n\t * Updates the slide number to match the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update slide number if enabled\n\t\tif( this.Reveal.getConfig().slideNumber && this.element ) {\n\t\t\tthis.element.innerHTML = this.getSlideNumber();\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the HTML string corresponding to the current slide\n\t * number, including formatting.\n\t */\n\tgetSlideNumber( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet value;\n\t\tlet format = SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL;\n\n\t\tif ( typeof config.slideNumber === 'function' ) {\n\t\t\tvalue = config.slideNumber( slide );\n\t\t} else {\n\t\t\t// Check if a custom number format is available\n\t\t\tif( typeof config.slideNumber === 'string' ) {\n\t\t\t\tformat = config.slideNumber;\n\t\t\t}\n\n\t\t\t// If there are ONLY vertical slides in this deck, always use\n\t\t\t// a flattened slide number\n\t\t\tif( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {\n\t\t\t\tformat = SLIDE_NUMBER_FORMAT_CURRENT;\n\t\t\t}\n\n\t\t\t// Offset the current slide number by 1 to make it 1-indexed\n\t\t\tlet horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;\n\n\t\t\tvalue = [];\n\t\t\tswitch( format ) {\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );\n\t\t\t\t\tbreak;\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet indices = this.Reveal.getIndices( slide );\n\t\t\t\t\tvalue.push( indices.h + horizontalOffset );\n\t\t\t\t\tlet sep = format === SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL ? '/' : '.';\n\t\t\t\t\tif( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );\n\t\t\t}\n\t\t}\n\n\t\tlet url = '#' + this.Reveal.location.getHash( slide );\n\t\treturn this.formatNumber( value[0], value[1], value[2], url );\n\n\t}\n\n\t/**\n\t * Applies HTML formatting to a slide number before it's\n\t * written to the DOM.\n\t *\n\t * @param {number} a Current slide\n\t * @param {string} delimiter Character to separate slide numbers\n\t * @param {(number|*)} b Total slides\n\t * @param {HTMLElement} [url='#'+locationHash()] The url to link to\n\t * @return {string} HTML string fragment\n\t */\n\tformatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {\n\n\t\tif( typeof b === 'number' && !isNaN( b ) ) {\n\t\t\treturn `\n\t\t\t\t\t${a} \n\t\t\t\t\t${delimiter} \n\t\t\t\t\t${b} \n\t\t\t\t\t `;\n\t\t}\n\t\telse {\n\t\t\treturn `\n\t\t\t\t\t${a} \n\t\t\t\t\t `;\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL\n} from \"../utils/constants\";\n\n/**\n * Makes it possible to jump to a slide by entering its\n * slide number or id.\n */\nexport default class JumpToSlide {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onInput = this.onInput.bind( this );\n\t\tthis.onBlur = this.onBlur.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'jump-to-slide';\n\n this.jumpInput = document.createElement( 'input' );\n this.jumpInput.type = 'text';\n this.jumpInput.className = 'jump-to-slide-input';\n this.jumpInput.placeholder = 'Jump to slide';\n\t\tthis.jumpInput.addEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.addEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.addEventListener( 'blur', this.onBlur );\n\n this.element.appendChild( this.jumpInput );\n\n\t}\n\n\tshow() {\n\n\t\tthis.indicesOnShow = this.Reveal.getIndices();\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\t\tthis.jumpInput.focus();\n\n\t}\n\n\thide() {\n\n\t\tif( this.isVisible() ) {\n\t\t\tthis.element.remove();\n\t\t\tthis.jumpInput.value = '';\n\n\t\t\tclearTimeout( this.jumpTimeout );\n\t\t\tdelete this.jumpTimeout;\n\t\t}\n\n\t}\n\n\tisVisible() {\n\n\t\treturn !!this.element.parentNode;\n\n\t}\n\n\t/**\n\t * Parses the current input and jumps to the given slide.\n\t */\n\tjump() {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tdelete this.jumpTimeout;\n\n\t\tlet query = this.jumpInput.value.trim( '' );\n\t\tlet indices;\n\n\t\t// When slide numbers are formatted to be a single linear number\n\t\t// (instead of showing a separate horizontal/vertical index) we\n\t\t// use the same format for slide jumps\n\t\tif( /^\\d+$/.test( query ) ) {\n\t\t\tconst slideNumberFormat = this.Reveal.getConfig().slideNumber;\n\t\t\tif( slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT || slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL ) {\n\t\t\t\tconst slide = this.Reveal.getSlides()[ parseInt( query, 10 ) - 1 ];\n\t\t\t\tif( slide ) {\n\t\t\t\t\tindices = this.Reveal.getIndices( slide );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !indices ) {\n\t\t\t// If the query uses \"horizontal.vertical\" format, convert to\n\t\t\t// \"horizontal/vertical\" so that our URL parser can understand\n\t\t\tif( /^\\d+\\.\\d+$/.test( query ) ) {\n\t\t\t\tquery = query.replace( '.', '/' );\n\t\t\t}\n\n\t\t\tindices = this.Reveal.location.getIndicesFromHash( query, { oneBasedIndex: true } );\n\t\t}\n\n\t\t// Still no valid index? Fall back on a text search\n\t\tif( !indices && /\\S+/i.test( query ) && query.length > 1 ) {\n\t\t\tindices = this.search( query );\n\t\t}\n\n\t\tif( indices && query !== '' ) {\n\t\t\tthis.Reveal.slide( indices.h, indices.v, indices.f );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tjumpAfter( delay ) {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tthis.jumpTimeout = setTimeout( () => this.jump(), delay );\n\n\t}\n\n\t/**\n\t * A lofi search that looks for the given query in all\n\t * of our slides and returns the first match.\n\t */\n\tsearch( query ) {\n\n\t\tconst regex = new RegExp( '\\\\b' + query.trim() + '\\\\b', 'i' );\n\n\t\tconst slide = this.Reveal.getSlides().find( ( slide ) => {\n\t\t\treturn regex.test( slide.innerText );\n\t\t} );\n\n\t\tif( slide ) {\n\t\t\treturn this.Reveal.getIndices( slide );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Reverts back to the slide we were on when jump to slide was\n\t * invoked.\n\t */\n\tcancel() {\n\n\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\tthis.hide();\n\n\t}\n\n\tconfirm() {\n\n\t\tthis.jump();\n\t\tthis.hide();\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.jumpInput.removeEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.removeEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.removeEventListener( 'blur', this.onBlur );\n\n\t\tthis.element.remove();\n\n\t}\n\n\tonKeyDown( event ) {\n\n\t\tif( event.keyCode === 13 ) {\n\t\t\tthis.confirm();\n\t\t}\n\t\telse if( event.keyCode === 27 ) {\n\t\t\tthis.cancel();\n\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\n\t}\n\n\tonInput( event ) {\n\n\t\tthis.jumpAfter( 200 );\n\n\t}\n\n\tonBlur() {\n\n\t\tsetTimeout( () => this.hide(), 1 );\n\n\t}\n\n}","/**\n * Converts various color input formats to an {r:0,g:0,b:0} object.\n *\n * @param {string} color The string representation of a color\n * @example\n * colorToRgb('#000');\n * @example\n * colorToRgb('#000000');\n * @example\n * colorToRgb('rgb(0,0,0)');\n * @example\n * colorToRgb('rgba(0,0,0)');\n *\n * @return {{r: number, g: number, b: number, [a]: number}|null}\n */\nexport const colorToRgb = ( color ) => {\n\n\tlet hex3 = color.match( /^#([0-9a-f]{3})$/i );\n\tif( hex3 && hex3[1] ) {\n\t\thex3 = hex3[1];\n\t\treturn {\n\t\t\tr: parseInt( hex3.charAt( 0 ), 16 ) * 0x11,\n\t\t\tg: parseInt( hex3.charAt( 1 ), 16 ) * 0x11,\n\t\t\tb: parseInt( hex3.charAt( 2 ), 16 ) * 0x11\n\t\t};\n\t}\n\n\tlet hex6 = color.match( /^#([0-9a-f]{6})$/i );\n\tif( hex6 && hex6[1] ) {\n\t\thex6 = hex6[1];\n\t\treturn {\n\t\t\tr: parseInt( hex6.slice( 0, 2 ), 16 ),\n\t\t\tg: parseInt( hex6.slice( 2, 4 ), 16 ),\n\t\t\tb: parseInt( hex6.slice( 4, 6 ), 16 )\n\t\t};\n\t}\n\n\tlet rgb = color.match( /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i );\n\tif( rgb ) {\n\t\treturn {\n\t\t\tr: parseInt( rgb[1], 10 ),\n\t\t\tg: parseInt( rgb[2], 10 ),\n\t\t\tb: parseInt( rgb[3], 10 )\n\t\t};\n\t}\n\n\tlet rgba = color.match( /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i );\n\tif( rgba ) {\n\t\treturn {\n\t\t\tr: parseInt( rgba[1], 10 ),\n\t\t\tg: parseInt( rgba[2], 10 ),\n\t\t\tb: parseInt( rgba[3], 10 ),\n\t\t\ta: parseFloat( rgba[4] )\n\t\t};\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Calculates brightness on a scale of 0-255.\n *\n * @param {string} color See colorToRgb for supported formats.\n * @see {@link colorToRgb}\n */\nexport const colorBrightness = ( color ) => {\n\n\tif( typeof color === 'string' ) color = colorToRgb( color );\n\n\tif( color ) {\n\t\treturn ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000;\n\t}\n\n\treturn null;\n\n}","import { queryAll } from '../utils/util.js'\nimport { colorToRgb, colorBrightness } from '../utils/color.js'\n\n/**\n * Creates and updates slide backgrounds.\n */\nexport default class Backgrounds {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'backgrounds';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Creates the slide background elements and appends them\n\t * to the background container. One element is created per\n\t * slide no matter if the given slide has visible background.\n\t */\n\tcreate() {\n\n\t\t// Clear prior backgrounds\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t// Iterate over all horizontal slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( slideh => {\n\n\t\t\tlet backgroundStack = this.createBackground( slideh, this.element );\n\n\t\t\t// Iterate over all vertical slides\n\t\t\tqueryAll( slideh, 'section' ).forEach( slidev => {\n\n\t\t\t\tthis.createBackground( slidev, backgroundStack );\n\n\t\t\t\tbackgroundStack.classList.add( 'stack' );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// Add parallax background if specified\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tthis.element.style.backgroundImage = 'url(\"' + this.Reveal.getConfig().parallaxBackgroundImage + '\")';\n\t\t\tthis.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;\n\t\t\tthis.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;\n\t\t\tthis.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;\n\n\t\t\t// Make sure the below properties are set on the element - these properties are\n\t\t\t// needed for proper transitions to be set on the element via CSS. To remove\n\t\t\t// annoying background slide-in effect when the presentation starts, apply\n\t\t\t// these properties after short time delay\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.add( 'has-parallax-background' );\n\t\t\t}, 1 );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.element.style.backgroundImage = '';\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a background for the given slide.\n\t *\n\t * @param {HTMLElement} slide\n\t * @param {HTMLElement} container The element that the background\n\t * should be appended to\n\t * @return {HTMLElement} New background div\n\t */\n\tcreateBackground( slide, container ) {\n\n\t\t// Main slide background element\n\t\tlet element = document.createElement( 'div' );\n\t\telement.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );\n\n\t\t// Inner background element that wraps images/videos/iframes\n\t\tlet contentElement = document.createElement( 'div' );\n\t\tcontentElement.className = 'slide-background-content';\n\n\t\telement.appendChild( contentElement );\n\t\tcontainer.appendChild( element );\n\n\t\tslide.slideBackgroundElement = element;\n\t\tslide.slideBackgroundContentElement = contentElement;\n\n\t\t// Syncs the background to reflect all current background settings\n\t\tthis.sync( slide );\n\n\t\treturn element;\n\n\t}\n\n\t/**\n\t * Renders all of the visual properties of a slide background\n\t * based on the various background attributes.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tsync( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement,\n\t\t\tcontentElement = slide.slideBackgroundContentElement;\n\n\t\tconst data = {\n\t\t\tbackground: slide.getAttribute( 'data-background' ),\n\t\t\tbackgroundSize: slide.getAttribute( 'data-background-size' ),\n\t\t\tbackgroundImage: slide.getAttribute( 'data-background-image' ),\n\t\t\tbackgroundVideo: slide.getAttribute( 'data-background-video' ),\n\t\t\tbackgroundIframe: slide.getAttribute( 'data-background-iframe' ),\n\t\t\tbackgroundColor: slide.getAttribute( 'data-background-color' ),\n\t\t\tbackgroundGradient: slide.getAttribute( 'data-background-gradient' ),\n\t\t\tbackgroundRepeat: slide.getAttribute( 'data-background-repeat' ),\n\t\t\tbackgroundPosition: slide.getAttribute( 'data-background-position' ),\n\t\t\tbackgroundTransition: slide.getAttribute( 'data-background-transition' ),\n\t\t\tbackgroundOpacity: slide.getAttribute( 'data-background-opacity' ),\n\t\t};\n\n\t\tconst dataPreload = slide.hasAttribute( 'data-preload' );\n\n\t\t// Reset the prior background state in case this is not the\n\t\t// initial sync\n\t\tslide.classList.remove( 'has-dark-background' );\n\t\tslide.classList.remove( 'has-light-background' );\n\n\t\telement.removeAttribute( 'data-loaded' );\n\t\telement.removeAttribute( 'data-background-hash' );\n\t\telement.removeAttribute( 'data-background-size' );\n\t\telement.removeAttribute( 'data-background-transition' );\n\t\telement.style.backgroundColor = '';\n\n\t\tcontentElement.style.backgroundSize = '';\n\t\tcontentElement.style.backgroundRepeat = '';\n\t\tcontentElement.style.backgroundPosition = '';\n\t\tcontentElement.style.backgroundImage = '';\n\t\tcontentElement.style.opacity = '';\n\t\tcontentElement.innerHTML = '';\n\n\t\tif( data.background ) {\n\t\t\t// Auto-wrap image urls in url(...)\n\t\t\tif( /^(http|file|\\/\\/)/gi.test( data.background ) || /\\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\\s]|$)/gi.test( data.background ) ) {\n\t\t\t\tslide.setAttribute( 'data-background-image', data.background );\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.background = data.background;\n\t\t\t}\n\t\t}\n\n\t\t// Create a hash for this combination of background settings.\n\t\t// This is used to determine when two slide backgrounds are\n\t\t// the same.\n\t\tif( data.background || data.backgroundColor || data.backgroundGradient || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {\n\t\t\telement.setAttribute( 'data-background-hash', data.background +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundSize +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundImage +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundVideo +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundIframe +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundColor +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundGradient +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundRepeat +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundPosition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundTransition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundOpacity );\n\t\t}\n\n\t\t// Additional and optional background properties\n\t\tif( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );\n\t\tif( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;\n\t\tif( data.backgroundGradient ) element.style.backgroundImage = data.backgroundGradient;\n\t\tif( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );\n\n\t\tif( dataPreload ) element.setAttribute( 'data-preload', '' );\n\n\t\t// Background image options are set on the content wrapper\n\t\tif( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;\n\t\tif( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;\n\t\tif( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;\n\t\tif( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;\n\n\t\tconst contrastClass = this.getContrastClass( slide );\n\n\t\tif( typeof contrastClass === 'string' ) {\n\t\t\tslide.classList.add( contrastClass );\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a class name that can be applied to a slide to indicate\n\t * if it has a light or dark background.\n\t *\n\t * @param {*} slide\n\t *\n\t * @returns {string|null}\n\t */\n\tgetContrastClass( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement;\n\n\t\t// If this slide has a background color, we add a class that\n\t\t// signals if it is light or dark. If the slide has no background\n\t\t// color, no class will be added\n\t\tlet contrastColor = slide.getAttribute( 'data-background-color' );\n\n\t\t// If no bg color was found, or it cannot be converted by colorToRgb, check the computed background\n\t\tif( !contrastColor || !colorToRgb( contrastColor ) ) {\n\t\t\tlet computedBackgroundStyle = window.getComputedStyle( element );\n\t\t\tif( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {\n\t\t\t\tcontrastColor = computedBackgroundStyle.backgroundColor;\n\t\t\t}\n\t\t}\n\n\t\tif( contrastColor ) {\n\t\t\tconst rgb = colorToRgb( contrastColor );\n\n\t\t\t// Ignore fully transparent backgrounds. Some browsers return\n\t\t\t// rgba(0,0,0,0) when reading the computed background color of\n\t\t\t// an element with no background\n\t\t\tif( rgb && rgb.a !== 0 ) {\n\t\t\t\tif( colorBrightness( contrastColor ) < 128 ) {\n\t\t\t\t\treturn 'has-dark-background';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn 'has-light-background';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Bubble the 'has-light-background'/'has-dark-background' classes.\n\t */\n\tbubbleSlideContrastClassToElement( slide, target ) {\n\n\t\t[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {\n\t\t\tif( slide.classList.contains( classToBubble ) ) {\n\t\t\t\ttarget.classList.add( classToBubble );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttarget.classList.remove( classToBubble );\n\t\t\t}\n\t\t}, this );\n\n\t}\n\n\t/**\n\t * Updates the background elements to reflect the current\n\t * slide.\n\t *\n\t * @param {boolean} includeAll If true, the backgrounds of\n\t * all vertical slides (not just the present) will be updated.\n\t */\n\tupdate( includeAll = false ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tlet currentBackground = null;\n\n\t\t// Reverse past/future classes when in RTL mode\n\t\tlet horizontalPast = config.rtl ? 'future' : 'past',\n\t\t\thorizontalFuture = config.rtl ? 'past' : 'future';\n\n\t\t// Update the classes of all backgrounds to match the\n\t\t// states of their slides (past/present/future)\n\t\tArray.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {\n\n\t\t\tbackgroundh.classList.remove( 'past', 'present', 'future' );\n\n\t\t\tif( h < indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalPast );\n\t\t\t}\n\t\t\telse if ( h > indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalFuture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundh.classList.add( 'present' );\n\n\t\t\t\t// Store a reference to the current background element\n\t\t\t\tcurrentBackground = backgroundh;\n\t\t\t}\n\n\t\t\tif( includeAll || h === indices.h ) {\n\t\t\t\tqueryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {\n\n\t\t\t\t\tbackgroundv.classList.remove( 'past', 'present', 'future' );\n\n\t\t\t\t\tconst indexv = typeof indices.v === 'number' ? indices.v : 0;\n\n\t\t\t\t\tif( v < indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'past' );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( v > indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'future' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundv.classList.add( 'present' );\n\n\t\t\t\t\t\t// Only if this is the present horizontal and vertical slide\n\t\t\t\t\t\tif( h === indices.h ) currentBackground = backgroundv;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t} );\n\n\t\t// The previous background may refer to a DOM element that has\n\t\t// been removed after a presentation is synced & bgs are recreated\n\t\tif( this.previousBackground && !this.previousBackground.closest( 'body' ) ) {\n\t\t\tthis.previousBackground = null;\n\t\t}\n\n\t\tif( currentBackground && this.previousBackground ) {\n\n\t\t\t// Don't transition between identical backgrounds. This\n\t\t\t// prevents unwanted flicker.\n\t\t\tlet previousBackgroundHash = this.previousBackground.getAttribute( 'data-background-hash' );\n\t\t\tlet currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );\n\n\t\t\tif( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {\n\t\t\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t\t\t// If multiple slides have the same background video, carry\n\t\t\t\t// the element forward so that it plays continuously\n\t\t\t\t// across multiple slides\n\t\t\t\tconst currentVideo = currentBackground.querySelector( 'video' );\n\t\t\t\tconst previousVideo = this.previousBackground.querySelector( 'video' );\n\n\t\t\t\tif( currentVideo && previousVideo ) {\n\n\t\t\t\t\tconst currentVideoParent = currentVideo.parentNode;\n\t\t\t\t\tconst previousVideoParent = previousVideo.parentNode;\n\n\t\t\t\t\t// Swap the two videos\n\t\t\t\t\tpreviousVideoParent.appendChild( currentVideo );\n\t\t\t\t\tcurrentVideoParent.appendChild( previousVideo );\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tconst backgroundChanged = currentBackground !== this.previousBackground;\n\n\t\t// Stop content inside of previous backgrounds\n\t\tif( backgroundChanged && this.previousBackground ) {\n\n\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );\n\n\t\t}\n\n\t\t// Start content in the current background\n\t\tif( backgroundChanged && currentBackground ) {\n\n\t\t\tthis.Reveal.slideContent.startEmbeddedContent( currentBackground );\n\n\t\t\tlet currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );\n\t\t\tif( currentBackgroundContent ) {\n\n\t\t\t\tlet backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';\n\n\t\t\t\t// Restart GIFs (doesn't work in Firefox)\n\t\t\t\tif( /\\.gif/i.test( backgroundImageURL ) ) {\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = '';\n\t\t\t\t\twindow.getComputedStyle( currentBackgroundContent ).opacity;\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = backgroundImageURL;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.previousBackground = currentBackground;\n\n\t\t}\n\n\t\t// If there's a background brightness flag for this slide,\n\t\t// bubble it to the .reveal container\n\t\tif( currentSlide ) {\n\t\t\tthis.bubbleSlideContrastClassToElement( currentSlide, this.Reveal.getRevealElement() );\n\t\t}\n\n\t\t// Allow the first background to apply without transition\n\t\tsetTimeout( () => {\n\t\t\tthis.element.classList.remove( 'no-transition' );\n\t\t}, 10 );\n\n\t}\n\n\t/**\n\t * Updates the position of the parallax background based\n\t * on the current slide index.\n\t */\n\tupdateParallax() {\n\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tlet horizontalSlides = this.Reveal.getHorizontalSlides(),\n\t\t\t\tverticalSlides = this.Reveal.getVerticalSlides();\n\n\t\t\tlet backgroundSize = this.element.style.backgroundSize.split( ' ' ),\n\t\t\t\tbackgroundWidth, backgroundHeight;\n\n\t\t\tif( backgroundSize.length === 1 ) {\n\t\t\t\tbackgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundWidth = parseInt( backgroundSize[0], 10 );\n\t\t\t\tbackgroundHeight = parseInt( backgroundSize[1], 10 );\n\t\t\t}\n\n\t\t\tlet slideWidth = this.element.offsetWidth,\n\t\t\t\thorizontalSlideCount = horizontalSlides.length,\n\t\t\t\thorizontalOffsetMultiplier,\n\t\t\t\thorizontalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {\n\t\t\t\thorizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;\n\t\t\t}\n\t\t\telse {\n\t\t\t\thorizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;\n\t\t\t}\n\n\t\t\thorizontalOffset = horizontalOffsetMultiplier * indices.h * -1;\n\n\t\t\tlet slideHeight = this.element.offsetHeight,\n\t\t\t\tverticalSlideCount = verticalSlides.length,\n\t\t\t\tverticalOffsetMultiplier,\n\t\t\t\tverticalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {\n\t\t\t\tverticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tverticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );\n\t\t\t}\n\n\t\t\tverticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;\n\n\t\t\tthis.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';\n\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n","import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'\nimport { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'\n\n// Counter used to generate unique IDs for auto-animated elements\nlet autoAnimateCounter = 0;\n\n/**\n * Automatically animates matching elements across\n * slides with the [data-auto-animate] attribute.\n */\nexport default class AutoAnimate {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Runs an auto-animation between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t */\n\trun( fromSlide, toSlide ) {\n\n\t\t// Clean up after prior animations\n\t\tthis.reset();\n\n\t\tlet allSlides = this.Reveal.getSlides();\n\t\tlet toSlideIndex = allSlides.indexOf( toSlide );\n\t\tlet fromSlideIndex = allSlides.indexOf( fromSlide );\n\n\t\t// Ensure that;\n\t\t// 1. Both slides exist.\n\t\t// 2. Both slides are auto-animate targets with the same\n\t\t// data-auto-animate-id value (including null if absent on both).\n\t\t// 3. data-auto-animate-restart isn't set on the physically latter\n\t\t// slide (independent of slide direction).\n\t\tif( fromSlide && toSlide && fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t&& fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) \n\t\t\t\t&& !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t// Create a new auto-animate sheet\n\t\t\tthis.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();\n\n\t\t\tlet animationOptions = this.getAutoAnimateOptions( toSlide );\n\n\t\t\t// Set our starting state\n\t\t\tfromSlide.dataset.autoAnimate = 'pending';\n\t\t\ttoSlide.dataset.autoAnimate = 'pending';\n\n\t\t\t// Flag the navigation direction, needed for fragment buildup\n\t\t\tanimationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward';\n\n\t\t\t// If the from-slide is hidden because it has moved outside\n\t\t\t// the view distance, we need to temporarily show it while\n\t\t\t// measuring\n\t\t\tlet fromSlideIsHidden = fromSlide.style.display === 'none';\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = this.Reveal.getConfig().display;\n\n\t\t\t// Inject our auto-animate styles for this transition\n\t\t\tlet css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {\n\t\t\t\treturn this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );\n\t\t\t} );\n\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = 'none';\n\n\t\t\t// Animate unmatched elements, if enabled\n\t\t\tif( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {\n\n\t\t\t\t// Our default timings for unmatched elements\n\t\t\t\tlet defaultUnmatchedDuration = animationOptions.duration * 0.8,\n\t\t\t\t\tdefaultUnmatchedDelay = animationOptions.duration * 0.2;\n\n\t\t\t\tthis.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {\n\n\t\t\t\t\tlet unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );\n\t\t\t\t\tlet id = 'unmatched';\n\n\t\t\t\t\t// If there is a duration or delay set specifically for this\n\t\t\t\t\t// element our unmatched elements should adhere to those\n\t\t\t\t\tif( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {\n\t\t\t\t\t\tid = 'unmatched-' + autoAnimateCounter++;\n\t\t\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"${id}\"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );\n\t\t\t\t\t}\n\n\t\t\t\t\tunmatchedElement.dataset.autoAnimateTarget = id;\n\n\t\t\t\t}, this );\n\n\t\t\t\t// Our default transition for unmatched elements\n\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );\n\n\t\t\t}\n\n\t\t\t// Setting the whole chunk of CSS at once is the most\n\t\t\t// efficient way to do this. Using sheet.insertRule\n\t\t\t// is multiple factors slower.\n\t\t\tthis.autoAnimateStyleSheet.innerHTML = css.join( '' );\n\n\t\t\t// Start the animation next cycle\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tif( this.autoAnimateStyleSheet ) {\n\t\t\t\t\t// This forces our newly injected styles to be applied in Firefox\n\t\t\t\t\tgetComputedStyle( this.autoAnimateStyleSheet ).fontWeight;\n\n\t\t\t\t\ttoSlide.dataset.autoAnimate = 'running';\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'autoanimate',\n\t\t\t\tdata: {\n\t\t\t\t\tfromSlide,\n\t\t\t\t\ttoSlide,\n\t\t\t\t\tsheet: this.autoAnimateStyleSheet\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rolls back all changes that we've made to the DOM so\n\t * that as part of animating.\n\t */\n\treset() {\n\n\t\t// Reset slides\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=\"\"])' ).forEach( element => {\n\t\t\telement.dataset.autoAnimate = '';\n\t\t} );\n\n\t\t// Reset elements\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {\n\t\t\tdelete element.dataset.autoAnimateTarget;\n\t\t} );\n\n\t\t// Remove the animation sheet\n\t\tif( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {\n\t\t\tthis.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );\n\t\t\tthis.autoAnimateStyleSheet = null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a FLIP animation where the `to` element starts out\n\t * in the `from` element position and animates to its original\n\t * state.\n\t *\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @param {Object} elementOptions Options for this element pair\n\t * @param {Object} animationOptions Options set at the slide level\n\t * @param {String} id Unique ID that we can use to identify this\n\t * auto-animate element in the DOM\n\t */\n\tautoAnimateElements( from, to, elementOptions, animationOptions, id ) {\n\n\t\t// 'from' elements are given a data-auto-animate-target with no value,\n\t\t// 'to' elements are are given a data-auto-animate-target with an ID\n\t\tfrom.dataset.autoAnimateTarget = '';\n\t\tto.dataset.autoAnimateTarget = id;\n\n\t\t// Each element may override any of the auto-animate options\n\t\t// like transition easing, duration and delay via data-attributes\n\t\tlet options = this.getAutoAnimateOptions( to, animationOptions );\n\n\t\t// If we're using a custom element matcher the element options\n\t\t// may contain additional transition overrides\n\t\tif( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;\n\t\tif( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;\n\t\tif( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;\n\n\t\tlet fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),\n\t\t\ttoProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );\n\n\t\tif( to.classList.contains( 'fragment' ) ) {\n\n\t\t\t// Don't auto-animate the opacity of fragments to avoid\n\t\t\t// conflicts with fragment animations\n\t\t\tdelete toProps.styles['opacity'];\n\n\t\t}\n\n\t\t// If translation and/or scaling are enabled, css transform\n\t\t// the 'to' element so that it matches the position and size\n\t\t// of the 'from' element\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\n\t\t\tlet presentationScale = this.Reveal.getScale();\n\n\t\t\tlet delta = {\n\t\t\t\tx: ( fromProps.x - toProps.x ) / presentationScale,\n\t\t\t\ty: ( fromProps.y - toProps.y ) / presentationScale,\n\t\t\t\tscaleX: fromProps.width / toProps.width,\n\t\t\t\tscaleY: fromProps.height / toProps.height\n\t\t\t};\n\n\t\t\t// Limit decimal points to avoid 0.0001px blur and stutter\n\t\t\tdelta.x = Math.round( delta.x * 1000 ) / 1000;\n\t\t\tdelta.y = Math.round( delta.y * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\n\t\t\tlet translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),\n\t\t\t\tscale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );\n\n\t\t\t// No need to transform if nothing's changed\n\t\t\tif( translate || scale ) {\n\n\t\t\t\tlet transform = [];\n\n\t\t\t\tif( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );\n\t\t\t\tif( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );\n\n\t\t\t\tfromProps.styles['transform'] = transform.join( ' ' );\n\t\t\t\tfromProps.styles['transform-origin'] = 'top left';\n\n\t\t\t\ttoProps.styles['transform'] = 'none';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Delete all unchanged 'to' styles\n\t\tfor( let propertyName in toProps.styles ) {\n\t\t\tconst toValue = toProps.styles[propertyName];\n\t\t\tconst fromValue = fromProps.styles[propertyName];\n\n\t\t\tif( toValue === fromValue ) {\n\t\t\t\tdelete toProps.styles[propertyName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// If these property values were set via a custom matcher providing\n\t\t\t\t// an explicit 'from' and/or 'to' value, we always inject those values.\n\t\t\t\tif( toValue.explicitValue === true ) {\n\t\t\t\t\ttoProps.styles[propertyName] = toValue.value;\n\t\t\t\t}\n\n\t\t\t\tif( fromValue.explicitValue === true ) {\n\t\t\t\t\tfromProps.styles[propertyName] = fromValue.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet css = '';\n\n\t\tlet toStyleProperties = Object.keys( toProps.styles );\n\n\t\t// Only create animate this element IF at least one style\n\t\t// property has changed\n\t\tif( toStyleProperties.length > 0 ) {\n\n\t\t\t// Instantly move to the 'from' state\n\t\t\tfromProps.styles['transition'] = 'none';\n\n\t\t\t// Animate towards the 'to' state\n\t\t\ttoProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;\n\t\t\ttoProps.styles['transition-property'] = toStyleProperties.join( ', ' );\n\t\t\ttoProps.styles['will-change'] = toStyleProperties.join( ', ' );\n\n\t\t\t// Build up our custom CSS. We need to override inline styles\n\t\t\t// so we need to make our styles vErY IMPORTANT!1!!\n\t\t\tlet fromCSS = Object.keys( fromProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tlet toCSS = Object.keys( toProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + toProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tcss = \t'[data-auto-animate-target=\"'+ id +'\"] {'+ fromCSS +'}' +\n\t\t\t\t\t'[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+ id +'\"] {'+ toCSS +'}';\n\n\t\t}\n\n\t\treturn css;\n\n\t}\n\n\t/**\n\t * Returns the auto-animate options for the given element.\n\t *\n\t * @param {HTMLElement} element Element to pick up options\n\t * from, either a slide or an animation target\n\t * @param {Object} [inheritedOptions] Optional set of existing\n\t * options\n\t */\n\tgetAutoAnimateOptions( element, inheritedOptions ) {\n\n\t\tlet options = {\n\t\t\teasing: this.Reveal.getConfig().autoAnimateEasing,\n\t\t\tduration: this.Reveal.getConfig().autoAnimateDuration,\n\t\t\tdelay: 0\n\t\t};\n\n\t\toptions = extend( options, inheritedOptions );\n\n\t\t// Inherit options from parent elements\n\t\tif( element.parentNode ) {\n\t\t\tlet autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );\n\t\t\tif( autoAnimatedParent ) {\n\t\t\t\toptions = this.getAutoAnimateOptions( autoAnimatedParent, options );\n\t\t\t}\n\t\t}\n\n\t\tif( element.dataset.autoAnimateEasing ) {\n\t\t\toptions.easing = element.dataset.autoAnimateEasing;\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDuration ) {\n\t\t\toptions.duration = parseFloat( element.dataset.autoAnimateDuration );\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDelay ) {\n\t\t\toptions.delay = parseFloat( element.dataset.autoAnimateDelay );\n\t\t}\n\n\t\treturn options;\n\n\t}\n\n\t/**\n\t * Returns an object containing all of the properties\n\t * that can be auto-animated for the given element and\n\t * their current computed values.\n\t *\n\t * @param {String} direction 'from' or 'to'\n\t */\n\tgetAutoAnimatableProperties( direction, element, elementOptions ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\tlet properties = { styles: [] };\n\n\t\t// Position and size\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\t\t\tlet bounds;\n\n\t\t\t// Custom auto-animate may optionally return a custom tailored\n\t\t\t// measurement function\n\t\t\tif( typeof elementOptions.measure === 'function' ) {\n\t\t\t\tbounds = elementOptions.measure( element );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( config.center ) {\n\t\t\t\t\t// More precise, but breaks when used in combination\n\t\t\t\t\t// with zoom for scaling the deck ¯\\_(ツ)_/¯\n\t\t\t\t\tbounds = element.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet scale = this.Reveal.getScale();\n\t\t\t\t\tbounds = {\n\t\t\t\t\t\tx: element.offsetLeft * scale,\n\t\t\t\t\t\ty: element.offsetTop * scale,\n\t\t\t\t\t\twidth: element.offsetWidth * scale,\n\t\t\t\t\t\theight: element.offsetHeight * scale\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperties.x = bounds.x;\n\t\t\tproperties.y = bounds.y;\n\t\t\tproperties.width = bounds.width;\n\t\t\tproperties.height = bounds.height;\n\t\t}\n\n\t\tconst computedStyles = getComputedStyle( element );\n\n\t\t// CSS styles\n\t\t( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {\n\t\t\tlet value;\n\n\t\t\t// `style` is either the property name directly, or an object\n\t\t\t// definition of a style property\n\t\t\tif( typeof style === 'string' ) style = { property: style };\n\n\t\t\tif( typeof style.from !== 'undefined' && direction === 'from' ) {\n\t\t\t\tvalue = { value: style.from, explicitValue: true };\n\t\t\t}\n\t\t\telse if( typeof style.to !== 'undefined' && direction === 'to' ) {\n\t\t\t\tvalue = { value: style.to, explicitValue: true };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Use a unitless value for line-height so that it inherits properly\n\t\t\t\tif( style.property === 'line-height' ) {\n\t\t\t\t\tvalue = parseFloat( computedStyles['line-height'] ) / parseFloat( computedStyles['font-size'] );\n\t\t\t\t}\n\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = computedStyles[style.property];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( value !== '' ) {\n\t\t\t\tproperties.styles[style.property] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Get a list of all element pairs that we can animate\n\t * between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t *\n\t * @return {Array} Each value is an array where [0] is\n\t * the element we're animating from and [1] is the\n\t * element we're animating to\n\t */\n\tgetAutoAnimatableElements( fromSlide, toSlide ) {\n\n\t\tlet matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;\n\n\t\tlet pairs = matcher.call( this, fromSlide, toSlide );\n\n\t\tlet reserved = [];\n\n\t\t// Remove duplicate pairs\n\t\treturn pairs.filter( ( pair, index ) => {\n\t\t\tif( reserved.indexOf( pair.to ) === -1 ) {\n\t\t\t\treserved.push( pair.to );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Identifies matching elements between slides.\n\t *\n\t * You can specify a custom matcher function by using\n\t * the `autoAnimateMatcher` config option.\n\t */\n\tgetAutoAnimatePairs( fromSlide, toSlide ) {\n\n\t\tlet pairs = [];\n\n\t\tconst codeNodes = 'pre';\n\t\tconst textNodes = 'h1, h2, h3, h4, h5, h6, p, li';\n\t\tconst mediaNodes = 'img, video, iframe';\n\n\t\t// Explicit matches via data-id\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {\n\t\t\treturn node.nodeName + ':::' + node.getAttribute( 'data-id' );\n\t\t} );\n\n\t\t// Text\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.textContent.trim();\n\t\t} );\n\n\t\t// Media\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {\n\t\t\treturn node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );\n\t\t} );\n\n\t\t// Code\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.textContent.trim();\n\t\t} );\n\n\t\tpairs.forEach( pair => {\n\t\t\t// Disable scale transformations on text nodes, we transition\n\t\t\t// each individual text property instead\n\t\t\tif( matches( pair.from, textNodes ) ) {\n\t\t\t\tpair.options = { scale: false };\n\t\t\t}\n\t\t\t// Animate individual lines of code\n\t\t\telse if( matches( pair.from, codeNodes ) ) {\n\n\t\t\t\t// Transition the code block's width and height instead of scaling\n\t\t\t\t// to prevent its content from being squished\n\t\t\t\tpair.options = { scale: false, styles: [ 'width', 'height' ] };\n\n\t\t\t\t// Lines of code\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {\n\t\t\t\t\treturn node.textContent;\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t\t// Line numbers\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-numbers[data-line-number]', node => {\n\t\t\t\t\treturn node.getAttribute( 'data-line-number' );\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [ 'width' ],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn pairs;\n\n\t}\n\n\t/**\n\t * Helper method which returns a bounding box based on\n\t * the given elements offset coordinates.\n\t *\n\t * @param {HTMLElement} element\n\t * @return {Object} x, y, width, height\n\t */\n\tgetLocalBoundingBox( element ) {\n\n\t\tconst presentationScale = this.Reveal.getScale();\n\n\t\treturn {\n\t\t\tx: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,\n\t\t\ty: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,\n\t\t\twidth: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,\n\t\t\theight: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100\n\t\t};\n\n\t}\n\n\t/**\n\t * Finds matching elements between two slides.\n\t *\n\t * @param {Array} pairs \tList of pairs to push matches to\n\t * @param {HTMLElement} fromScope Scope within the from element exists\n\t * @param {HTMLElement} toScope Scope within the to element exists\n\t * @param {String} selector CSS selector of the element to match\n\t * @param {Function} serializer A function that accepts an element and returns\n\t * a stringified ID based on its contents\n\t * @param {Object} animationOptions Optional config options for this pair\n\t */\n\tfindAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {\n\n\t\tlet fromMatches = {};\n\t\tlet toMatches = {};\n\n\t\t[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\tif( typeof key === 'string' && key.length ) {\n\t\t\t\tfromMatches[key] = fromMatches[key] || [];\n\t\t\t\tfromMatches[key].push( element );\n\t\t\t}\n\t\t} );\n\n\t\t[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\ttoMatches[key] = toMatches[key] || [];\n\t\t\ttoMatches[key].push( element );\n\n\t\t\tlet fromElement;\n\n\t\t\t// Retrieve the 'from' element\n\t\t\tif( fromMatches[key] ) {\n\t\t\t\tconst primaryIndex = toMatches[key].length - 1;\n\t\t\t\tconst secondaryIndex = fromMatches[key].length - 1;\n\n\t\t\t\t// If there are multiple identical from elements, retrieve\n\t\t\t\t// the one at the same index as our to-element.\n\t\t\t\tif( fromMatches[key][ primaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ primaryIndex ];\n\t\t\t\t\tfromMatches[key][ primaryIndex ] = null;\n\t\t\t\t}\n\t\t\t\t// If there are no matching from-elements at the same index,\n\t\t\t\t// use the last one.\n\t\t\t\telse if( fromMatches[key][ secondaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ secondaryIndex ];\n\t\t\t\t\tfromMatches[key][ secondaryIndex ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got a matching pair, push it to the list of pairs\n\t\t\tif( fromElement ) {\n\t\t\t\tpairs.push({\n\t\t\t\t\tfrom: fromElement,\n\t\t\t\t\tto: element,\n\t\t\t\t\toptions: animationOptions\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a all elements within the given scope that should\n\t * be considered unmatched in an auto-animate transition. If\n\t * fading of unmatched elements is turned on, these elements\n\t * will fade when going between auto-animate slides.\n\t *\n\t * Note that parents of auto-animate targets are NOT considered\n\t * unmatched since fading them would break the auto-animation.\n\t *\n\t * @param {HTMLElement} rootElement\n\t * @return {Array}\n\t */\n\tgetUnmatchedAutoAnimateElements( rootElement ) {\n\n\t\treturn [].slice.call( rootElement.children ).reduce( ( result, element ) => {\n\n\t\t\tconst containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );\n\n\t\t\t// The element is unmatched if\n\t\t\t// - It is not an auto-animate target\n\t\t\t// - It does not contain any auto-animate targets\n\t\t\tif( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {\n\t\t\t\tresult.push( element );\n\t\t\t}\n\n\t\t\tif( element.querySelector( '[data-auto-animate-target]' ) ) {\n\t\t\t\tresult = result.concat( this.getUnmatchedAutoAnimateElements( element ) );\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}, [] );\n\n\t}\n\n}\n","import { HORIZONTAL_SLIDES_SELECTOR, HORIZONTAL_BACKGROUNDS_SELECTOR } from '../utils/constants.js'\nimport { queryAll } from '../utils/util.js'\n\nconst HIDE_SCROLLBAR_TIMEOUT = 500;\nconst MAX_PROGRESS_SPACING = 4;\nconst MIN_PROGRESS_SEGMENT_HEIGHT = 6;\nconst MIN_PLAYHEAD_HEIGHT = 8;\n\n/**\n * The scroll view lets you read a reveal.js presentation\n * as a linear scrollable page.\n */\nexport default class ScrollView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.onScroll = this.onScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Activates the scroll view. This rearranges the presentation DOM\n\t * by—among other things—wrapping each slide in a page element.\n\t */\n\tactivate() {\n\n\t\tif( this.active ) return;\n\n\t\tconst stateBeforeActivation = this.Reveal.getState();\n\n\t\tthis.active = true;\n\n\t\t// Store the full presentation HTML so that we can restore it\n\t\t// when/if the scroll view is deactivated\n\t\tthis.slideHTMLBeforeActivation = this.Reveal.getSlidesElement().innerHTML;\n\n\t\tconst horizontalSlides = queryAll( this.Reveal.getRevealElement(), HORIZONTAL_SLIDES_SELECTOR );\n\t\tconst horizontalBackgrounds = queryAll( this.Reveal.getRevealElement(), HORIZONTAL_BACKGROUNDS_SELECTOR );\n\n\t\tthis.viewportElement.classList.add( 'loading-scroll-mode', 'reveal-scroll' );\n\n\t\tlet presentationBackground;\n\n\t\tconst viewportStyles = window.getComputedStyle( this.viewportElement );\n\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\tpresentationBackground = viewportStyles.background;\n\t\t}\n\n\t\tconst pageElements = [];\n\t\tconst pageContainer = horizontalSlides[0].parentNode;\n\n\t\tlet previousSlide;\n\n\t\t// Creates a new page element and appends the given slide/bg\n\t\t// to it.\n\t\tconst createPageElement = ( slide, h, v, isVertical ) => {\n\n\t\t\tlet contentContainer;\n\n\t\t\t// If this slide is part of an auto-animation sequence, we\n\t\t\t// group it under the same page element as the previous slide\n\t\t\tif( previousSlide && this.Reveal.shouldAutoAnimateBetween( previousSlide, slide ) ) {\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content scroll-auto-animate-page';\n\t\t\t\tcontentContainer.style.display = 'none';\n\t\t\t\tpreviousSlide.closest( '.scroll-page-content' ).parentNode.appendChild( contentContainer );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpage.className = 'scroll-page';\n\t\t\t\tpageElements.push( page );\n\n\t\t\t\t// This transfers over the background of the vertical stack containing\n\t\t\t\t// the slide if it exists. Otherwise, it uses the presentation-wide\n\t\t\t\t// background.\n\t\t\t\tif( isVertical && horizontalBackgrounds.length > h ) {\n\t\t\t\t\tconst slideBackground = horizontalBackgrounds[h];\n\t\t\t\t\tconst pageBackground = window.getComputedStyle( slideBackground );\n\n\t\t\t\t\tif( pageBackground && pageBackground.background ) {\n\t\t\t\t\t\tpage.style.background = pageBackground.background;\n\t\t\t\t\t}\n\t\t\t\t\telse if( presentationBackground ) {\n\t\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t\t}\n\t\t\t\t} else if( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tconst stickyContainer = document.createElement( 'div' );\n\t\t\t\tstickyContainer.className = 'scroll-page-sticky';\n\t\t\t\tpage.appendChild( stickyContainer );\n\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content';\n\t\t\t\tstickyContainer.appendChild( contentContainer );\n\t\t\t}\n\n\t\t\tcontentContainer.appendChild( slide );\n\n\t\t\tslide.classList.remove( 'past', 'future' );\n\t\t\tslide.setAttribute( 'data-index-h', h );\n\t\t\tslide.setAttribute( 'data-index-v', v );\n\n\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\tslide.slideBackgroundElement.remove( 'past', 'future' );\n\t\t\t\tcontentContainer.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t}\n\n\t\t\tpreviousSlide = slide;\n\n\t\t}\n\n\t\t// Slide and slide background layout\n\t\thorizontalSlides.forEach( ( horizontalSlide, h ) => {\n\n\t\t\tif( this.Reveal.isVerticalStack( horizontalSlide ) ) {\n\t\t\t\thorizontalSlide.querySelectorAll( 'section' ).forEach( ( verticalSlide, v ) => {\n\t\t\t\t\tcreatePageElement( verticalSlide, h, v, true );\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcreatePageElement( horizontalSlide, h, 0 );\n\t\t\t}\n\n\t\t}, this );\n\n\t\tthis.createProgressBar();\n\n\t\t// Remove leftover stacks\n\t\tqueryAll( this.Reveal.getRevealElement(), '.stack' ).forEach( stack => stack.remove() );\n\n\t\t// Add our newly created pages to the DOM\n\t\tpageElements.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\tthis.Reveal.layout();\n\t\tthis.Reveal.setState( stateBeforeActivation );\n\n\t\tthis.activatedCallbacks.forEach( callback => callback() );\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.restoreScrollPosition();\n\n\t\tthis.viewportElement.classList.remove( 'loading-scroll-mode' );\n\t\tthis.viewportElement.addEventListener( 'scroll', this.onScroll, { passive: true } );\n\n\t}\n\n\t/**\n\t * Deactivates the scroll view and restores the standard slide-based\n\t * presentation.\n\t */\n\tdeactivate() {\n\n\t\tif( !this.active ) return;\n\n\t\tconst stateBeforeDeactivation = this.Reveal.getState();\n\n\t\tthis.active = false;\n\n\t\tthis.viewportElement.removeEventListener( 'scroll', this.onScroll );\n\t\tthis.viewportElement.classList.remove( 'reveal-scroll' );\n\n\t\tthis.removeProgressBar();\n\n\t\tthis.Reveal.getSlidesElement().innerHTML = this.slideHTMLBeforeActivation;\n\t\tthis.Reveal.sync();\n\t\tthis.Reveal.setState( stateBeforeDeactivation );\n\n\t\tthis.slideHTMLBeforeActivation = null;\n\n\t}\n\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the scroll view is currently active.\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Renders the progress bar component.\n\t */\n\tcreateProgressBar() {\n\n\t\tthis.progressBar = document.createElement( 'div' );\n\t\tthis.progressBar.className = 'scrollbar';\n\n\t\tthis.progressBarInner = document.createElement( 'div' );\n\t\tthis.progressBarInner.className = 'scrollbar-inner';\n\t\tthis.progressBar.appendChild( this.progressBarInner );\n\n\t\tthis.progressBarPlayhead = document.createElement( 'div' );\n\t\tthis.progressBarPlayhead.className = 'scrollbar-playhead';\n\t\tthis.progressBarInner.appendChild( this.progressBarPlayhead );\n\n\t\tthis.viewportElement.insertBefore( this.progressBar, this.viewportElement.firstChild );\n\n\t\tconst handleDocumentMouseMove\t= ( event ) => {\n\n\t\t\tlet progress = ( event.clientY - this.progressBarInner.getBoundingClientRect().top ) / this.progressBarHeight;\n\t\t\tprogress = Math.max( Math.min( progress, 1 ), 0 );\n\n\t\t\tthis.viewportElement.scrollTop = progress * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\n\t\t};\n\n\t\tconst handleDocumentMouseUp = ( event ) => {\n\n\t\t\tthis.draggingProgressBar = false;\n\t\t\tthis.showProgressBar();\n\n\t\t\tdocument.removeEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.removeEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t};\n\n\t\tconst handleMouseDown = ( event ) => {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.draggingProgressBar = true;\n\n\t\t\tdocument.addEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.addEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t\thandleDocumentMouseMove( event );\n\n\t\t};\n\n\t\tthis.progressBarInner.addEventListener( 'mousedown', handleMouseDown );\n\n\t}\n\n\tremoveProgressBar() {\n\n\t\tif( this.progressBar ) {\n\t\t\tthis.progressBar.remove();\n\t\t\tthis.progressBar = null;\n\t\t}\n\n\t}\n\n\tlayout() {\n\n\t\tif( this.isActive() ) {\n\t\t\tthis.syncPages();\n\t\t\tthis.syncScrollPosition();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates our pages to match the latest configuration and\n\t * presentation size.\n\t */\n\tsyncPages() {\n\n\t\tconst config = this.Reveal.getConfig();\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\t\tconst scale = this.Reveal.getScale();\n\t\tconst useCompactLayout = config.scrollLayout === 'compact';\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst compactHeight = slideSize.height * scale;\n\t\tconst pageHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\t// The height that needs to be scrolled between scroll triggers\n\t\tthis.scrollTriggerHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\tthis.viewportElement.style.setProperty( '--page-height', pageHeight + 'px' );\n\t\tthis.viewportElement.style.scrollSnapType = typeof config.scrollSnap === 'string' ? `y ${config.scrollSnap}` : '';\n\n\t\t// This will hold all scroll triggers used to show/hide slides\n\t\tthis.slideTriggers = [];\n\n\t\tconst pageElements = Array.from( this.Reveal.getRevealElement().querySelectorAll( '.scroll-page' ) );\n\n\t\tthis.pages = pageElements.map( pageElement => {\n\t\t\tconst page = this.createPage({\n\t\t\t\tpageElement,\n\t\t\t\tslideElement: pageElement.querySelector( 'section' ),\n\t\t\t\tstickyElement: pageElement.querySelector( '.scroll-page-sticky' ),\n\t\t\t\tcontentElement: pageElement.querySelector( '.scroll-page-content' ),\n\t\t\t\tbackgroundElement: pageElement.querySelector( '.slide-background' ),\n\t\t\t\tautoAnimateElements: pageElement.querySelectorAll( '.scroll-auto-animate-page' ),\n\t\t\t\tautoAnimatePages: []\n\t\t\t});\n\n\t\t\tpage.pageElement.style.setProperty( '--slide-height', config.center === true ? 'auto' : slideSize.height + 'px' );\n\n\t\t\tthis.slideTriggers.push({\n\t\t\t\tpage: page,\n\t\t\t\tactivate: () => this.activatePage( page ),\n\t\t\t\tdeactivate: () => this.deactivatePage( page )\n\t\t\t});\n\n\t\t\t// Create scroll triggers that show/hide fragments\n\t\t\tthis.createFragmentTriggersForPage( page );\n\n\t\t\t// Create scroll triggers for triggering auto-animate steps\n\t\t\tif( page.autoAnimateElements.length > 0 ) {\n\t\t\t\tthis.createAutoAnimateTriggersForPage( page );\n\t\t\t}\n\n\t\t\tlet totalScrollTriggerCount = Math.max( page.scrollTriggers.length - 1, 0 );\n\n\t\t\t// Each auto-animate step may include its own scroll triggers\n\t\t\t// for fragments, ensure we count those as well\n\t\t\ttotalScrollTriggerCount += page.autoAnimatePages.reduce( ( total, page ) => {\n\t\t\t\treturn total + Math.max( page.scrollTriggers.length - 1, 0 );\n\t\t\t}, page.autoAnimatePages.length );\n\n\t\t\t// Clean up from previous renders\n\t\t\tpage.pageElement.querySelectorAll( '.scroll-snap-point' ).forEach( el => el.remove() );\n\n\t\t\t// Create snap points for all scroll triggers\n\t\t\t// - Can't be absolute in FF\n\t\t\t// - Can't be 0-height in Safari\n\t\t\t// - Can't use snap-align on parent in Safari because then\n\t\t\t// inner triggers won't work\n\t\t\tfor( let i = 0; i < totalScrollTriggerCount + 1; i++ ) {\n\t\t\t\tconst triggerStick = document.createElement( 'div' );\n\t\t\t\ttriggerStick.className = 'scroll-snap-point';\n\t\t\t\ttriggerStick.style.height = this.scrollTriggerHeight + 'px';\n\t\t\t\ttriggerStick.style.scrollSnapAlign = useCompactLayout ? 'center' : 'start';\n\t\t\t\tpage.pageElement.appendChild( triggerStick );\n\n\t\t\t\tif( i === 0 ) {\n\t\t\t\t\ttriggerStick.style.marginTop = -this.scrollTriggerHeight + 'px';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// In the compact layout, only slides with scroll triggers cover the\n\t\t\t// full viewport height. This helps avoid empty gaps before or after\n\t\t\t// a sticky slide.\n\t\t\tif( useCompactLayout && page.scrollTriggers.length > 0 ) {\n\t\t\t\tpage.pageHeight = viewportHeight;\n\t\t\t\tpage.pageElement.style.setProperty( '--page-height', viewportHeight + 'px' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.pageHeight = pageHeight;\n\t\t\t\tpage.pageElement.style.removeProperty( '--page-height' );\n\t\t\t}\n\n\t\t\t// Add scroll padding based on how many scroll triggers we have\n\t\t\tpage.scrollPadding = this.scrollTriggerHeight * totalScrollTriggerCount;\n\n\t\t\t// The total height including scrollable space\n\t\t\tpage.totalHeight = page.pageHeight + page.scrollPadding;\n\n\t\t\t// This is used to pad the height of our page in CSS\n\t\t\tpage.pageElement.style.setProperty( '--page-scroll-padding', page.scrollPadding + 'px' );\n\n\t\t\t// If this is a sticky page, stick it to the vertical center\n\t\t\tif( totalScrollTriggerCount > 0 ) {\n\t\t\t\tpage.stickyElement.style.position = 'sticky';\n\t\t\t\tpage.stickyElement.style.top = Math.max( ( viewportHeight - page.pageHeight ) / 2, 0 ) + 'px';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.stickyElement.style.position = 'relative';\n\t\t\t\tpage.pageElement.style.scrollSnapAlign = page.pageHeight < viewportHeight ? 'center' : 'start';\n\t\t\t}\n\n\t\t\treturn page;\n\t\t} );\n\n\t\tthis.setTriggerRanges();\n\n\t\t/*\n\t\tconsole.log(this.slideTriggers.map( t => {\n\t\t\treturn {\n\t\t\t\trange: `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`,\n\t\t\t\ttriggers: t.page.scrollTriggers.map( t => {\n\t\t\t\t\treturn `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`\n\t\t\t\t}).join( ', ' ),\n\t\t\t}\n\t\t}))\n\t\t*/\n\n\t\tthis.viewportElement.setAttribute( 'data-scrollbar', config.scrollProgress );\n\n\t\tif( config.scrollProgress && this.totalScrollTriggerCount > 1 ) {\n\t\t\t// Create the progress bar if it doesn't already exist\n\t\t\tif( !this.progressBar ) this.createProgressBar();\n\n\t\t\tthis.syncProgressBar();\n\t\t}\n\t\telse {\n\t\t\tthis.removeProgressBar();\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and sets the scroll range for all of our scroll\n\t * triggers.\n\t */\n\tsetTriggerRanges() {\n\n\t\t// Calculate the total number of scroll triggers\n\t\tthis.totalScrollTriggerCount = this.slideTriggers.reduce( ( total, trigger ) => {\n\t\t\treturn total + Math.max( trigger.page.scrollTriggers.length, 1 );\n\t\t}, 0 );\n\n\t\tlet rangeStart = 0;\n\n\t\t// Calculate the scroll range of each scroll trigger on a scale\n\t\t// of 0-1\n\t\tthis.slideTriggers.forEach( ( trigger, i ) => {\n\t\t\ttrigger.range = [\n\t\t\t\trangeStart,\n\t\t\t\trangeStart + Math.max( trigger.page.scrollTriggers.length, 1 ) / this.totalScrollTriggerCount\n\t\t\t];\n\n\t\t\tconst scrollTriggerSegmentSize = ( trigger.range[1] - trigger.range[0] ) / trigger.page.scrollTriggers.length;\n\t\t\t// Set the range for each inner scroll trigger\n\t\t\ttrigger.page.scrollTriggers.forEach( ( scrollTrigger, i ) => {\n\t\t\t\tscrollTrigger.range = [\n\t\t\t\t\trangeStart + i * scrollTriggerSegmentSize,\n\t\t\t\t\trangeStart + ( i + 1 ) * scrollTriggerSegmentSize\n\t\t\t\t];\n\t\t\t} );\n\n\t\t\trangeStart = trigger.range[1];\n\t\t} );\n\n\t\t// Ensure the last trigger extends to the end of the page, otherwise\n\t\t// rounding errors can cause the last trigger to end at 0.999999...\n\t\tthis.slideTriggers[this.slideTriggers.length - 1].range[1] = 1;\n\n\t}\n\n\t/**\n\t * Creates one scroll trigger for each fragments in the given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateFragmentTriggersForPage( page, slideElement ) {\n\n\t\tslideElement = slideElement || page.slideElement;\n\n\t\t// Each fragment 'group' is an array containing one or more\n\t\t// fragments. Multiple fragments that appear at the same time\n\t\t// are part of the same group.\n\t\tconst fragmentGroups = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment' ), true );\n\n\t\t// Create scroll triggers that show/hide fragments\n\t\tif( fragmentGroups.length ) {\n\t\t\tpage.fragments = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tpage.scrollTriggers.push(\n\t\t\t\t// Trigger for the initial state with no fragments visible\n\t\t\t\t{\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( -1, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Triggers for each fragment group\n\t\t\tfragmentGroups.forEach( ( fragments, i ) => {\n\t\t\t\tpage.scrollTriggers.push({\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( i, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\n\n\t\treturn page.scrollTriggers.length;\n\n\t}\n\n\t/**\n\t * Creates scroll triggers for the auto-animate steps in the\n\t * given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateAutoAnimateTriggersForPage( page ) {\n\n\t\tif( page.autoAnimateElements.length > 0 ) {\n\n\t\t\t// Triggers for each subsequent auto-animate slide\n\t\t\tthis.slideTriggers.push( ...Array.from( page.autoAnimateElements ).map( ( autoAnimateElement, i ) => {\n\t\t\t\tlet autoAnimatePage = this.createPage({\n\t\t\t\t\tslideElement: autoAnimateElement.querySelector( 'section' ),\n\t\t\t\t\tcontentElement: autoAnimateElement,\n\t\t\t\t\tbackgroundElement: autoAnimateElement.querySelector( '.slide-background' )\n\t\t\t\t});\n\n\t\t\t\t// Create fragment scroll triggers for the auto-animate slide\n\t\t\t\tthis.createFragmentTriggersForPage( autoAnimatePage, autoAnimatePage.slideElement );\n\n\t\t\t\tpage.autoAnimatePages.push( autoAnimatePage );\n\n\t\t\t\t// Return our slide trigger\n\t\t\t\treturn {\n\t\t\t\t\tpage: autoAnimatePage,\n\t\t\t\t\tactivate: () => this.activatePage( autoAnimatePage ),\n\t\t\t\t\tdeactivate: () => this.deactivatePage( autoAnimatePage )\n\t\t\t\t};\n\t\t\t}));\n\t\t}\n\n\t}\n\n\t/**\n\t * Helper method for creating a page definition and adding\n\t * required fields. A \"page\" is a slide or auto-animate step.\n\t */\n\tcreatePage( page ) {\n\n\t\tpage.scrollTriggers = [];\n\t\tpage.indexh = parseInt( page.slideElement.getAttribute( 'data-index-h' ), 10 );\n\t\tpage.indexv = parseInt( page.slideElement.getAttribute( 'data-index-v' ), 10 );\n\n\t\treturn page;\n\n\t}\n\n\t/**\n\t * Rerenders progress bar segments so that they match the current\n\t * reveal.js config and size.\n\t */\n\tsyncProgressBar() {\n\n\t\tthis.progressBarInner.querySelectorAll( '.scrollbar-slide' ).forEach( slide => slide.remove() );\n\n\t\tconst scrollHeight = this.viewportElement.scrollHeight;\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / scrollHeight;\n\n\t\tthis.progressBarHeight = this.progressBarInner.offsetHeight;\n\t\tthis.playheadHeight = Math.max( viewportHeightFactor * this.progressBarHeight, MIN_PLAYHEAD_HEIGHT );\n\t\tthis.progressBarScrollableHeight = this.progressBarHeight - this.playheadHeight;\n\n\t\tconst progressSegmentHeight = viewportHeight / scrollHeight * this.progressBarHeight;\n\t\tconst spacing = Math.min( progressSegmentHeight / 8, MAX_PROGRESS_SPACING );\n\n\t\tthis.progressBarPlayhead.style.height = this.playheadHeight - spacing + 'px';\n\n\t\t// Don't show individual segments if they're too small\n\t\tif( progressSegmentHeight > MIN_PROGRESS_SEGMENT_HEIGHT ) {\n\n\t\t\tthis.slideTriggers.forEach( slideTrigger => {\n\n\t\t\t\tconst { page } = slideTrigger;\n\n\t\t\t\t// Visual representation of a slide\n\t\t\t\tpage.progressBarSlide = document.createElement( 'div' );\n\t\t\t\tpage.progressBarSlide.className = 'scrollbar-slide';\n\t\t\t\tpage.progressBarSlide.style.top = slideTrigger.range[0] * this.progressBarHeight + 'px';\n\t\t\t\tpage.progressBarSlide.style.height = ( slideTrigger.range[1] - slideTrigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\tpage.progressBarSlide.classList.toggle( 'has-triggers', page.scrollTriggers.length > 0 );\n\t\t\t\tthis.progressBarInner.appendChild( page.progressBarSlide );\n\n\t\t\t\t// Visual representations of each scroll trigger\n\t\t\t\tpage.scrollTriggerElements = page.scrollTriggers.map( ( trigger, i ) => {\n\n\t\t\t\t\tconst triggerElement = document.createElement( 'div' );\n\t\t\t\t\ttriggerElement.className = 'scrollbar-trigger';\n\t\t\t\t\ttriggerElement.style.top = ( trigger.range[0] - slideTrigger.range[0] ) * this.progressBarHeight + 'px';\n\t\t\t\t\ttriggerElement.style.height = ( trigger.range[1] - trigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\t\tpage.progressBarSlide.appendChild( triggerElement );\n\n\t\t\t\t\tif( i === 0 ) triggerElement.style.display = 'none';\n\n\t\t\t\t\treturn triggerElement;\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.pages.forEach( page => page.progressBarSlide = null );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Reads the current scroll position and updates our active\n\t * trigger states accordingly.\n\t */\n\tsyncScrollPosition() {\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / this.viewportElement.scrollHeight;\n\n\t\tconst scrollTop = this.viewportElement.scrollTop;\n\t\tconst scrollHeight = this.viewportElement.scrollHeight - viewportHeight\n\t\tconst scrollProgress = Math.max( Math.min( scrollTop / scrollHeight, 1 ), 0 );\n\t\tconst scrollProgressMid = Math.max( Math.min( ( scrollTop + viewportHeight / 2 ) / this.viewportElement.scrollHeight, 1 ), 0 );\n\n\t\tlet activePage;\n\n\t\tthis.slideTriggers.forEach( ( trigger ) => {\n\t\t\tconst { page } = trigger;\n\n\t\t\tconst shouldPreload = scrollProgress >= trigger.range[0] - viewportHeightFactor*2 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscrollProgress <= trigger.range[1] + viewportHeightFactor*2;\n\n\t\t\t// Load slides that are within the preload range\n\t\t\tif( shouldPreload && !page.loaded ) {\n\t\t\t\tpage.loaded = true;\n\t\t\t\tthis.Reveal.slideContent.load( page.slideElement );\n\t\t\t}\n\t\t\telse if( page.loaded ) {\n\t\t\t\tpage.loaded = false;\n\t\t\t\tthis.Reveal.slideContent.unload( page.slideElement );\n\t\t\t}\n\n\t\t\t// If we're within this trigger range, activate it\n\t\t\tif( scrollProgress >= trigger.range[0] && scrollProgress <= trigger.range[1] ) {\n\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\tactivePage = trigger.page;\n\t\t\t}\n\t\t\t// .. otherwise deactivate\n\t\t\telse if( trigger.active ) {\n\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t}\n\t\t} );\n\n\t\t// Each page can have its own scroll triggers, check if any of those\n\t\t// need to be activated/deactivated\n\t\tif( activePage ) {\n\t\t\tactivePage.scrollTriggers.forEach( ( trigger ) => {\n\t\t\t\tif( scrollProgressMid >= trigger.range[0] && scrollProgressMid <= trigger.range[1] ) {\n\t\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\t}\n\t\t\t\telse if( trigger.active ) {\n\t\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Update our visual progress indication\n\t\tthis.setProgressBarValue( scrollTop / ( this.viewportElement.scrollHeight - viewportHeight ) );\n\n\t}\n\n\t/**\n\t * Moves the progress bar playhead to the specified position.\n\t *\n\t * @param {number} progress 0-1\n\t */\n\tsetProgressBarValue( progress ) {\n\n\t\tif( this.progressBar ) {\n\n\t\t\tthis.progressBarPlayhead.style.transform = `translateY(${progress * this.progressBarScrollableHeight}px)`;\n\n\t\t\tthis.getAllPages()\n\t\t\t\t.filter( page => page.progressBarSlide )\n\t\t\t\t.forEach( ( page ) => {\n\t\t\t\t\tpage.progressBarSlide.classList.toggle( 'active', page.active === true );\n\n\t\t\t\t\tpage.scrollTriggers.forEach( ( trigger, i ) => {\n\t\t\t\t\t\tpage.scrollTriggerElements[i].classList.toggle( 'active', page.active === true && trigger.active === true );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\tthis.showProgressBar();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Show the progress bar and, if configured, automatically hide\n\t * it after a delay.\n\t */\n\tshowProgressBar() {\n\n\t\tthis.progressBar.classList.add( 'visible' );\n\n\t\tclearTimeout( this.hideProgressBarTimeout );\n\n\t\tif( this.Reveal.getConfig().scrollProgress === 'auto' && !this.draggingProgressBar ) {\n\n\t\t\tthis.hideProgressBarTimeout = setTimeout( () => {\n\t\t\t\tif( this.progressBar ) {\n\t\t\t\t\tthis.progressBar.classList.remove( 'visible' );\n\t\t\t\t}\n\t\t\t}, HIDE_SCROLLBAR_TIMEOUT );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Scroll to the previous page.\n\t */\n\tprev() {\n\n\t\tthis.viewportElement.scrollTop -= this.scrollTriggerHeight;\n\n\t}\n\n\t/**\n\t * Scroll to the next page.\n\t */\n\tnext() {\n\n\t\tthis.viewportElement.scrollTop += this.scrollTriggerHeight;\n\n\t}\n\n\t/**\n\t * Scrolls the given slide element into view.\n\t *\n\t * @param {HTMLElement} slideElement\n\t */\n\tscrollToSlide( slideElement ) {\n\n\t\t// If the scroll view isn't active yet, queue this action\n\t\tif( !this.active ) {\n\t\t\tthis.activatedCallbacks.push( () => this.scrollToSlide( slideElement ) );\n\t\t}\n\t\telse {\n\t\t\t// Find the trigger for this slide\n\t\t\tconst trigger = this.getScrollTriggerBySlide( slideElement );\n\n\t\t\tif( trigger ) {\n\t\t\t\t// Use the trigger's range to calculate the scroll position\n\t\t\t\tthis.viewportElement.scrollTop = trigger.range[0] * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Persists the current scroll position to session storage\n\t * so that it can be restored.\n\t */\n\tstoreScrollPosition() {\n\n\t\tclearTimeout( this.storeScrollPositionTimeout );\n\n\t\tthis.storeScrollPositionTimeout = setTimeout( () => {\n\t\t\tsessionStorage.setItem( 'reveal-scroll-top', this.viewportElement.scrollTop );\n\t\t\tsessionStorage.setItem( 'reveal-scroll-origin', location.origin + location.pathname );\n\n\t\t\tthis.storeScrollPositionTimeout = null;\n\t\t}, 50 );\n\n\t}\n\n\t/**\n\t * Restores the scroll position when a deck is reloader.\n\t */\n\trestoreScrollPosition() {\n\n\t\tconst scrollPosition = sessionStorage.getItem( 'reveal-scroll-top' );\n\t\tconst scrollOrigin = sessionStorage.getItem( 'reveal-scroll-origin' );\n\n\t\tif( scrollPosition && scrollOrigin === location.origin + location.pathname ) {\n\t\t\tthis.viewportElement.scrollTop = parseInt( scrollPosition, 10 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Activates the given page and starts its embedded content\n\t * if there is any.\n\t *\n\t * @param {object} page\n\t */\n\tactivatePage( page ) {\n\n\t\tif( !page.active ) {\n\n\t\t\tpage.active = true;\n\n\t\t\tconst { slideElement, backgroundElement, contentElement, indexh, indexv } = page;\n\n\t\t\tcontentElement.style.display = 'block';\n\n\t\t\tslideElement.classList.add( 'present' );\n\n\t\t\tif( backgroundElement ) {\n\t\t\t\tbackgroundElement.classList.add( 'present' );\n\t\t\t}\n\n\t\t\tthis.Reveal.setCurrentScrollPage( slideElement, indexh, indexv );\n\t\t\tthis.Reveal.backgrounds.bubbleSlideContrastClassToElement( slideElement, this.viewportElement );\n\n\t\t\t// If this page is part of an auto-animation there will be one\n\t\t\t// content element per auto-animated page. We need to show the\n\t\t\t// current page and hide all others.\n\t\t\tArray.from( contentElement.parentNode.querySelectorAll( '.scroll-page-content' ) ).forEach( sibling => {\n\t\t\t\tif( sibling !== contentElement ) {\n\t\t\t\t\tsibling.style.display = 'none';\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deactivates the page after it has been visible.\n\t *\n\t * @param {object} page\n\t */\n\tdeactivatePage( page ) {\n\n\t\tif( page.active ) {\n\n\t\t\tpage.active = false;\n\t\t\tif( page.slideElement ) page.slideElement.classList.remove( 'present' );\n\t\t\tif( page.backgroundElement ) page.backgroundElement.classList.remove( 'present' );\n\n\t\t}\n\n\t}\n\n\tactivateTrigger( trigger ) {\n\n\t\tif( !trigger.active ) {\n\t\t\ttrigger.active = true;\n\t\t\ttrigger.activate();\n\t\t}\n\n\t}\n\n\tdeactivateTrigger( trigger ) {\n\n\t\tif( trigger.active ) {\n\t\t\ttrigger.active = false;\n\n\t\t\tif( trigger.deactivate ) {\n\t\t\t\ttrigger.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieve a slide by its original h/v index (i.e. the indices the\n\t * slide had before being linearized).\n\t *\n\t * @param {number} h\n\t * @param {number} v\n\t * @returns {HTMLElement}\n\t */\n\tgetSlideByIndices( h, v ) {\n\n\t\tconst page = this.getAllPages().find( page => {\n\t\t\treturn page.indexh === h && page.indexv === v;\n\t\t} );\n\n\t\treturn page ? page.slideElement : null;\n\n\t}\n\n\t/**\n\t * Retrieve a list of all scroll triggers for the given slide\n\t * DOM element.\n\t *\n\t * @param {HTMLElement} slide\n\t * @returns {Array}\n\t */\n\tgetScrollTriggerBySlide( slide ) {\n\n\t\treturn this.slideTriggers.find( trigger => trigger.page.slideElement === slide );\n\n\t}\n\n\t/**\n\t * Get a list of all pages in the scroll view. This includes\n\t * both top-level slides and auto-animate steps.\n\t *\n\t * @returns {Array}\n\t */\n\tgetAllPages() {\n\n\t\treturn this.pages.flatMap( page => [page, ...(page.autoAnimatePages || [])] );\n\n\t}\n\n\tonScroll() {\n\n\t\tthis.syncScrollPosition();\n\t\tthis.storeScrollPosition();\n\n\t}\n\n\tget viewportElement() {\n\n\t\treturn this.Reveal.getViewportElement();\n\n\t}\n\n}\n","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll, createStyleSheet } from '../utils/util.js'\n\n/**\n * Setups up our presentation for printing/exporting to PDF.\n */\nexport default class PrintView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Configures the presentation for printing to a static\n\t * PDF.\n\t */\n\tasync activate() {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst slides = queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR )\n\n\t\t// Compute slide numbers now, before we start duplicating slides\n\t\tconst injectPageNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\n\t\t// Dimensions of the PDF pages\n\t\tconst pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),\n\t\t\tpageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );\n\n\t\t// Dimensions of slides within the pages\n\t\tconst slideWidth = slideSize.width,\n\t\t\tslideHeight = slideSize.height;\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\t// Let the browser know what page size we want to print\n\t\tcreateStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );\n\n\t\t// Limit the size of certain elements to the dimensions of the slide\n\t\tcreateStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );\n\n\t\tdocument.documentElement.classList.add( 'reveal-print', 'print-pdf' );\n\t\tdocument.body.style.width = pageWidth + 'px';\n\t\tdocument.body.style.height = pageHeight + 'px';\n\n\t\tconst viewportElement = this.Reveal.getViewportElement();\n\t\tlet presentationBackground;\n\t\tif( viewportElement ) {\n\t\t\tconst viewportStyles = window.getComputedStyle( viewportElement );\n\t\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\t\tpresentationBackground = viewportStyles.background;\n\t\t\t}\n\t\t}\n\n\t\t// Make sure stretch elements fit on slide\n\t\tawait new Promise( requestAnimationFrame );\n\t\tthis.Reveal.layoutSlideContents( slideWidth, slideHeight );\n\n\t\t// Batch scrollHeight access to prevent layout thrashing\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tconst slideScrollHeights = slides.map( slide => slide.scrollHeight );\n\n\t\tconst pages = [];\n\t\tconst pageContainer = slides[0].parentNode;\n\t\tlet slideNumber = 1;\n\n\t\t// Slide and slide background layout\n\t\tslides.forEach( function( slide, index ) {\n\n\t\t\t// Vertical stacks are not centred since their section\n\t\t\t// children will be\n\t\t\tif( slide.classList.contains( 'stack' ) === false ) {\n\t\t\t\t// Center the slide inside of the page, giving the slide some margin\n\t\t\t\tlet left = ( pageWidth - slideWidth ) / 2;\n\t\t\t\tlet top = ( pageHeight - slideHeight ) / 2;\n\n\t\t\t\tconst contentHeight = slideScrollHeights[ index ];\n\t\t\t\tlet numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );\n\n\t\t\t\t// Adhere to configured pages per slide limit\n\t\t\t\tnumberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );\n\n\t\t\t\t// Center slides vertically\n\t\t\t\tif( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\ttop = Math.max( ( pageHeight - contentHeight ) / 2, 0 );\n\t\t\t\t}\n\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpages.push( page );\n\n\t\t\t\tpage.className = 'pdf-page';\n\t\t\t\tpage.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';\n\n\t\t\t\t// Copy the presentation-wide background to each individual\n\t\t\t\t// page when printing\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tpage.appendChild( slide );\n\n\t\t\t\t// Position the slide inside of the page\n\t\t\t\tslide.style.left = left + 'px';\n\t\t\t\tslide.style.top = top + 'px';\n\t\t\t\tslide.style.width = slideWidth + 'px';\n\n\t\t\t\tthis.Reveal.slideContent.layout( slide );\n\n\t\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\t\tpage.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t\t}\n\n\t\t\t\t// Inject notes if `showNotes` is enabled\n\t\t\t\tif( config.showNotes ) {\n\n\t\t\t\t\t// Are there notes for this slide?\n\t\t\t\t\tconst notes = this.Reveal.getSlideNotes( slide );\n\t\t\t\t\tif( notes ) {\n\n\t\t\t\t\t\tconst notesSpacing = 8;\n\t\t\t\t\t\tconst notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';\n\t\t\t\t\t\tconst notesElement = document.createElement( 'div' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes-pdf' );\n\t\t\t\t\t\tnotesElement.setAttribute( 'data-layout', notesLayout );\n\t\t\t\t\t\tnotesElement.innerHTML = notes;\n\n\t\t\t\t\t\tif( notesLayout === 'separate-page' ) {\n\t\t\t\t\t\t\tpages.push( notesElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tnotesElement.style.left = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.bottom = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';\n\t\t\t\t\t\t\tpage.appendChild( notesElement );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Inject page numbers if `slideNumbers` are enabled\n\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\tconst numberElement = document.createElement( 'div' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number-pdf' );\n\t\t\t\t\tnumberElement.innerHTML = slideNumber++;\n\t\t\t\t\tpage.appendChild( numberElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy page and show fragments one after another\n\t\t\t\tif( config.pdfSeparateFragments ) {\n\n\t\t\t\t\t// Each fragment 'group' is an array containing one or more\n\t\t\t\t\t// fragments. Multiple fragments that appear at the same time\n\t\t\t\t\t// are part of the same group.\n\t\t\t\t\tconst fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );\n\n\t\t\t\t\tlet previousFragmentStep;\n\n\t\t\t\t\tfragmentGroups.forEach( function( fragments, index ) {\n\n\t\t\t\t\t\t// Remove 'current-fragment' from the previous group\n\t\t\t\t\t\tif( previousFragmentStep ) {\n\t\t\t\t\t\t\tpreviousFragmentStep.forEach( function( fragment ) {\n\t\t\t\t\t\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show the fragments for the current index\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.add( 'visible', 'current-fragment' );\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t\t// Create a separate page for the current fragment state\n\t\t\t\t\t\tconst clonedPage = page.cloneNode( true );\n\n\t\t\t\t\t\t// Inject unique page numbers for fragments\n\t\t\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\t\t\tconst numberElement = clonedPage.querySelector( '.slide-number-pdf' );\n\t\t\t\t\t\t\tconst fragmentNumber = index + 1;\n\t\t\t\t\t\t\tnumberElement.innerHTML += '.' + fragmentNumber;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpages.push( clonedPage );\n\n\t\t\t\t\t\tpreviousFragmentStep = fragments;\n\n\t\t\t\t\t}, this );\n\n\t\t\t\t\t// Reset the first/original page so that all fragments are hidden\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\t\t\t\t// Show all fragments\n\t\t\t\telse {\n\t\t\t\t\tqueryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {\n\t\t\t\t\t\tfragment.classList.add( 'visible' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tpages.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\t// Notify subscribers that the PDF layout is good to go\n\t\tthis.Reveal.dispatchEvent({ type: 'pdf-ready' });\n\n\t\tviewportElement.classList.remove( 'loading-scroll-mode' );\n\n\t}\n\n\t/**\n\t * Checks if the print mode is/should be activated.\n\t */\n\tisActive() {\n\n\t\treturn this.Reveal.getConfig().view === 'print';\n\n\t}\n\n}","import { extend, queryAll } from '../utils/util.js'\n\n/**\n * Handles sorting and navigation of slide fragments.\n * Fragments are elements within a slide that are\n * revealed/animated incrementally.\n */\nexport default class Fragments {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.fragments === false ) {\n\t\t\tthis.disable();\n\t\t}\n\t\telse if( oldConfig.fragments === false ) {\n\t\t\tthis.enable();\n\t\t}\n\n\t}\n\n\t/**\n\t * If fragments are disabled in the deck, they should all be\n\t * visible rather than stepped through.\n\t */\n\tdisable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.add( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Reverse of #disable(). Only called if fragments have\n\t * previously been disabled.\n\t */\n\tenable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.remove( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an object describing the available fragment\n\t * directions.\n\t *\n\t * @return {{prev: boolean, next: boolean}}\n\t */\n\tavailableRoutes() {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\t\t\tlet fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );\n\t\t\tlet hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );\n\n\t\t\treturn {\n\t\t\t\tprev: fragments.length - hiddenFragments.length > 0,\n\t\t\t\tnext: !!hiddenFragments.length\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\treturn { prev: false, next: false };\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a sorted fragments list, ordered by an increasing\n\t * \"data-fragment-index\" attribute.\n\t *\n\t * Fragments will be revealed in the order that they are returned by\n\t * this function, so you can use the index attributes to control the\n\t * order of fragment appearance.\n\t *\n\t * To maintain a sensible default fragment order, fragments are presumed\n\t * to be passed in document order. This function adds a \"fragment-index\"\n\t * attribute to each node if such an attribute is not already present,\n\t * and sets that attribute to an integer value which is the position of\n\t * the fragment within the fragments list.\n\t *\n\t * @param {object[]|*} fragments\n\t * @param {boolean} grouped If true the returned array will contain\n\t * nested arrays for all fragments with the same index\n\t * @return {object[]} sorted Sorted array of fragments\n\t */\n\tsort( fragments, grouped = false ) {\n\n\t\tfragments = Array.from( fragments );\n\n\t\tlet ordered = [],\n\t\t\tunordered = [],\n\t\t\tsorted = [];\n\n\t\t// Group ordered and unordered elements\n\t\tfragments.forEach( fragment => {\n\t\t\tif( fragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\tlet index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );\n\n\t\t\t\tif( !ordered[index] ) {\n\t\t\t\t\tordered[index] = [];\n\t\t\t\t}\n\n\t\t\t\tordered[index].push( fragment );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tunordered.push( [ fragment ] );\n\t\t\t}\n\t\t} );\n\n\t\t// Append fragments without explicit indices in their\n\t\t// DOM order\n\t\tordered = ordered.concat( unordered );\n\n\t\t// Manually count the index up per group to ensure there\n\t\t// are no gaps\n\t\tlet index = 0;\n\n\t\t// Push all fragments in their sorted order to an array,\n\t\t// this flattens the groups\n\t\tordered.forEach( group => {\n\t\t\tgroup.forEach( fragment => {\n\t\t\t\tsorted.push( fragment );\n\t\t\t\tfragment.setAttribute( 'data-fragment-index', index );\n\t\t\t} );\n\n\t\t\tindex ++;\n\t\t} );\n\n\t\treturn grouped === true ? ordered : sorted;\n\n\t}\n\n\t/**\n\t * Sorts and formats all of fragments in the\n\t * presentation.\n\t */\n\tsortAll() {\n\n\t\tthis.Reveal.getHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tlet verticalSlides = queryAll( horizontalSlide, 'section' );\n\t\t\tverticalSlides.forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tthis.sort( verticalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\t}, this );\n\n\t\t\tif( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Refreshes the fragments on the current slide so that they\n\t * have the appropriate classes (.visible + .current-fragment).\n\t *\n\t * @param {number} [index] The index of the current fragment\n\t * @param {array} [fragments] Array containing all fragments\n\t * in the current slide\n\t *\n\t * @return {{shown: array, hidden: array}}\n\t */\n\tupdate( index, fragments, slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet changedFragments = {\n\t\t\tshown: [],\n\t\t\thidden: []\n\t\t};\n\n\t\tif( slide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tfragments = fragments || this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t\t\tif( fragments.length ) {\n\n\t\t\t\tlet maxIndex = 0;\n\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet currentFragment = this.sort( slide.querySelectorAll( '.fragment.visible' ) ).pop();\n\t\t\t\t\tif( currentFragment ) {\n\t\t\t\t\t\tindex = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( fragments ).forEach( ( el, i ) => {\n\n\t\t\t\t\tif( el.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\t\ti = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t\t}\n\n\t\t\t\t\tmaxIndex = Math.max( maxIndex, i );\n\n\t\t\t\t\t// Visible fragments\n\t\t\t\t\tif( i <= index ) {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.add( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( i === index ) {\n\t\t\t\t\t\t\t// Announce the fragments one by one to the Screen Reader\n\t\t\t\t\t\t\tthis.Reveal.announceStatus( this.Reveal.getStatusText( el ) );\n\n\t\t\t\t\t\t\tel.classList.add( 'current-fragment' );\n\t\t\t\t\t\t\tthis.Reveal.slideContent.startEmbeddedContent( el );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( !wasVisible ) {\n\t\t\t\t\t\t\tchangedFragments.shown.push( el )\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'visible',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Hidden fragments\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.remove( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( wasVisible ) {\n\t\t\t\t\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( el );\n\t\t\t\t\t\t\tchangedFragments.hidden.push( el );\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// Write the current fragment index to the slide .\n\t\t\t\t// This can be used by end users to apply styles based on\n\t\t\t\t// the current fragment index.\n\t\t\t\tindex = typeof index === 'number' ? index : -1;\n\t\t\t\tindex = Math.max( Math.min( index, maxIndex ), -1 );\n\t\t\t\tslide.setAttribute( 'data-fragment', index );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif( changedFragments.hidden.length ) {\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'fragmenthidden',\n\t\t\t\tdata: {\n\t\t\t\t\tfragment: changedFragments.hidden[0],\n\t\t\t\t\tfragments: changedFragments.hidden\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif( changedFragments.shown.length ) {\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'fragmentshown',\n\t\t\t\tdata: {\n\t\t\t\t\tfragment: changedFragments.shown[0],\n\t\t\t\t\tfragments: changedFragments.shown\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn changedFragments;\n\n\t}\n\n\t/**\n\t * Formats the fragments on the given slide so that they have\n\t * valid indices. Call this if fragments are changed in the DOM\n\t * after reveal.js has already initialized.\n\t *\n\t * @param {HTMLElement} slide\n\t * @return {Array} a list of the HTML fragments that were synced\n\t */\n\tsync( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\treturn this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t}\n\n\t/**\n\t * Navigate to the specified slide fragment.\n\t *\n\t * @param {?number} index The index of the fragment that\n\t * should be shown, -1 means all are invisible\n\t * @param {number} offset Integer offset to apply to the\n\t * fragment index\n\t *\n\t * @return {boolean} true if a change was made in any\n\t * fragments visibility as part of this call\n\t */\n\tgoto( index, offset = 0 ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tlet fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tif( fragments.length ) {\n\n\t\t\t\t// If no index is specified, find the current\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();\n\n\t\t\t\t\tif( lastVisibleFragment ) {\n\t\t\t\t\t\tindex = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tindex = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply the offset if there is one\n\t\t\t\tindex += offset;\n\n\t\t\t\tlet changedFragments = this.update( index, fragments );\n\n\t\t\t\tthis.Reveal.controls.update();\n\t\t\t\tthis.Reveal.progress.update();\n\n\t\t\t\tif( this.Reveal.getConfig().fragmentInURL ) {\n\t\t\t\t\tthis.Reveal.location.writeURL();\n\t\t\t\t}\n\n\t\t\t\treturn !!( changedFragments.shown.length || changedFragments.hidden.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Navigate to the next slide fragment.\n\t *\n\t * @return {boolean} true if there was a next fragment,\n\t * false otherwise\n\t */\n\tnext() {\n\n\t\treturn this.goto( null, 1 );\n\n\t}\n\n\t/**\n\t * Navigate to the previous slide fragment.\n\t *\n\t * @return {boolean} true if there was a previous fragment,\n\t * false otherwise\n\t */\n\tprev() {\n\n\t\treturn this.goto( null, -1 );\n\n\t}\n\n}","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { extend, queryAll, transformElement } from '../utils/util.js'\n\n/**\n * Handles all logic related to the overview mode\n * (birds-eye view of all slides).\n */\nexport default class Overview {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\n\t\tthis.onSlideClicked = this.onSlideClicked.bind( this );\n\n\t}\n\n\t/**\n\t * Displays the overview of slides (quick nav) by scaling\n\t * down and arranging all slide elements.\n\t */\n\tactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview && !this.Reveal.isScrollView() && !this.isActive() ) {\n\n\t\t\tthis.active = true;\n\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview' );\n\n\t\t\t// Don't auto-slide while in overview mode\n\t\t\tthis.Reveal.cancelAutoSlide();\n\n\t\t\t// Move the backgrounds element into the slide container to\n\t\t\t// that the same scaling is applied\n\t\t\tthis.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clicking on an overview slide navigates to it\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\tif( !slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tslide.addEventListener( 'click', this.onSlideClicked, true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Calculate slide sizes\n\t\t\tconst margin = 70;\n\t\t\tconst slideSize = this.Reveal.getComputedSlideSize();\n\t\t\tthis.overviewSlideWidth = slideSize.width + margin;\n\t\t\tthis.overviewSlideHeight = slideSize.height + margin;\n\n\t\t\t// Reverse in RTL mode\n\t\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\t\tthis.overviewSlideWidth = -this.overviewSlideWidth;\n\t\t\t}\n\n\t\t\tthis.Reveal.updateSlidesVisibility();\n\n\t\t\tthis.layout();\n\t\t\tthis.update();\n\n\t\t\tthis.Reveal.layout();\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\t// Notify observers of the overview showing\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewshown',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses CSS transforms to position all slides in a grid for\n\t * display inside of the overview mode.\n\t */\n\tlayout() {\n\n\t\t// Layout slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {\n\t\t\thslide.setAttribute( 'data-index-h', h );\n\t\t\ttransformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tif( hslide.classList.contains( 'stack' ) ) {\n\n\t\t\t\tqueryAll( hslide, 'section' ).forEach( ( vslide, v ) => {\n\t\t\t\t\tvslide.setAttribute( 'data-index-h', h );\n\t\t\t\t\tvslide.setAttribute( 'data-index-v', v );\n\n\t\t\t\t\ttransformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\t// Layout slide backgrounds\n\t\tArray.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {\n\t\t\ttransformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tqueryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {\n\t\t\t\ttransformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Moves the overview viewport to the current slides.\n\t * Called each time the current slide changes.\n\t */\n\tupdate() {\n\n\t\tconst vmin = Math.min( window.innerWidth, window.innerHeight );\n\t\tconst scale = Math.max( vmin / 5, 150 ) / vmin;\n\t\tconst indices = this.Reveal.getIndices();\n\n\t\tthis.Reveal.transformSlides( {\n\t\t\toverview: [\n\t\t\t\t'scale('+ scale +')',\n\t\t\t\t'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',\n\t\t\t\t'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'\n\t\t\t].join( ' ' )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the slide overview and enters the currently\n\t * active slide.\n\t */\n\tdeactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview ) {\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview' );\n\n\t\t\t// Temporarily add a class so that transitions can do different things\n\t\t\t// depending on whether they are exiting/entering overview, or just\n\t\t\t// moving from slide to slide\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview-deactivating' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );\n\t\t\t}, 1 );\n\n\t\t\t// Move the background element back out\n\t\t\tthis.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clean up changes made to slides\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\ttransformElement( slide, '' );\n\n\t\t\t\tslide.removeEventListener( 'click', this.onSlideClicked, true );\n\t\t\t} );\n\n\t\t\t// Clean up changes made to backgrounds\n\t\t\tqueryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {\n\t\t\t\ttransformElement( background, '' );\n\t\t\t} );\n\n\t\t\tthis.Reveal.transformSlides( { overview: '' } );\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\tthis.Reveal.slide( indices.h, indices.v );\n\t\t\tthis.Reveal.layout();\n\t\t\tthis.Reveal.cueAutoSlide();\n\n\t\t\t// Notify observers of the overview hiding\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewhidden',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the slide overview mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * overview is open, false means it's closed.\n\t */\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the overview is currently active.\n\t *\n\t * @return {Boolean} true if the overview is active,\n\t * false otherwise\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Invoked when a slide is and we're in the overview.\n\t *\n\t * @param {object} event\n\t */\n\tonSlideClicked( event ) {\n\n\t\tif( this.isActive() ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tlet element = event.target;\n\n\t\t\twhile( element && !element.nodeName.match( /section/gi ) ) {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\tif( element && !element.classList.contains( 'disabled' ) ) {\n\n\t\t\t\tthis.deactivate();\n\n\t\t\t\tif( element.nodeName.match( /section/gi ) ) {\n\t\t\t\t\tlet h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),\n\t\t\t\t\t\tv = parseInt( element.getAttribute( 'data-index-v' ), 10 );\n\n\t\t\t\t\tthis.Reveal.slide( h, v );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n}","import { enterFullscreen } from '../utils/util.js'\n\n/**\n * Handles all reveal.js keyboard interactions.\n */\nexport default class Keyboard {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// A key:value map of keyboard keys and descriptions of\n\t\t// the actions they trigger\n\t\tthis.shortcuts = {};\n\n\t\t// Holds custom key code mappings\n\t\tthis.bindings = {};\n\n\t\tthis.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.navigationMode === 'linear' ) {\n\t\t\tthis.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide';\n\t\t\tthis.shortcuts['← , ↑ , P , H , K'] = 'Previous slide';\n\t\t}\n\t\telse {\n\t\t\tthis.shortcuts['N , SPACE'] = 'Next slide';\n\t\t\tthis.shortcuts['P , Shift SPACE'] = 'Previous slide';\n\t\t\tthis.shortcuts['← , H'] = 'Navigate left';\n\t\t\tthis.shortcuts['→ , L'] = 'Navigate right';\n\t\t\tthis.shortcuts['↑ , K'] = 'Navigate up';\n\t\t\tthis.shortcuts['↓ , J'] = 'Navigate down';\n\t\t}\n\n\t\tthis.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments';\n\t\tthis.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide';\n\t\tthis.shortcuts['B , .'] = 'Pause';\n\t\tthis.shortcuts['F'] = 'Fullscreen';\n\t\tthis.shortcuts['G'] = 'Jump to slide';\n\t\tthis.shortcuts['ESC, O'] = 'Slide overview';\n\n\t}\n\n\t/**\n\t * Starts listening for keyboard events.\n\t */\n\tbind() {\n\n\t\tdocument.addEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Stops listening for keyboard events.\n\t */\n\tunbind() {\n\n\t\tdocument.removeEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Add a custom key binding with optional description to\n\t * be added to the help screen.\n\t */\n\taddKeyBinding( binding, callback ) {\n\n\t\tif( typeof binding === 'object' && binding.keyCode ) {\n\t\t\tthis.bindings[binding.keyCode] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: binding.key,\n\t\t\t\tdescription: binding.description\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tthis.bindings[binding] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: null,\n\t\t\t\tdescription: null\n\t\t\t};\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes the specified custom key binding.\n\t */\n\tremoveKeyBinding( keyCode ) {\n\n\t\tdelete this.bindings[keyCode];\n\n\t}\n\n\t/**\n\t * Programmatically triggers a keyboard event\n\t *\n\t * @param {int} keyCode\n\t */\n\ttriggerKey( keyCode ) {\n\n\t\tthis.onDocumentKeyDown( { keyCode } );\n\n\t}\n\n\t/**\n\t * Registers a new shortcut to include in the help overlay\n\t *\n\t * @param {String} key\n\t * @param {String} value\n\t */\n\tregisterKeyboardShortcut( key, value ) {\n\n\t\tthis.shortcuts[key] = value;\n\n\t}\n\n\tgetShortcuts() {\n\n\t\treturn this.shortcuts;\n\n\t}\n\n\tgetBindings() {\n\n\t\treturn this.bindings;\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keydown' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyDown( event ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// If there's a condition specified and it returns false,\n\t\t// ignore this event\n\t\tif( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If keyboardCondition is set, only capture keyboard events\n\t\t// for embedded decks when they are focused\n\t\tif( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Shorthand\n\t\tlet keyCode = event.keyCode;\n\n\t\t// Remember if auto-sliding was paused so we can toggle it\n\t\tlet autoSlideWasPaused = !this.Reveal.isAutoSliding();\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\t// Is there a focused element that could be using the keyboard?\n\t\tlet activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;\n\t\tlet activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );\n\t\tlet activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);\n\n\t\t// Whitelist certain modifiers for slide navigation shortcuts\n\t\tlet keyCodeUsesModifier = [32, 37, 38, 39, 40, 63, 78, 80, 191].indexOf( event.keyCode ) !== -1;\n\n\t\t// Prevent all other events when a modifier is pressed\n\t\tlet unusedModifier = \t!( keyCodeUsesModifier && event.shiftKey || event.altKey ) &&\n\t\t\t\t\t\t\t\t( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );\n\n\t\t// Disregard the event if there's a focused element or a\n\t\t// keyboard modifier key is present\n\t\tif( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;\n\n\t\t// While paused only allow resume keyboard events; 'b', 'v', '.'\n\t\tlet resumeKeyCodes = [66,86,190,191,112];\n\t\tlet key;\n\n\t\t// Custom key bindings for togglePause should be able to resume\n\t\tif( typeof config.keyboard === 'object' ) {\n\t\t\tfor( key in config.keyboard ) {\n\t\t\t\tif( config.keyboard[key] === 'togglePause' ) {\n\t\t\t\t\tresumeKeyCodes.push( parseInt( key, 10 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( this.Reveal.isOverlayOpen() && ![\"Escape\", \"f\", \"c\", \"b\", \".\"].includes(event.key) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Use linear navigation if we're configured to OR if\n\t\t// the presentation is one-dimensional\n\t\tlet useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();\n\n\t\tlet triggered = false;\n\n\t\t// 1. User defined key bindings\n\t\tif( typeof config.keyboard === 'object' ) {\n\n\t\t\tfor( key in config.keyboard ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet value = config.keyboard[ key ];\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof value === 'function' ) {\n\t\t\t\t\t\tvalue.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ value ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 2. Registered custom key bindings\n\t\tif( triggered === false ) {\n\n\t\t\tfor( key in this.bindings ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet action = this.bindings[ key ].callback;\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof action === 'function' ) {\n\t\t\t\t\t\taction.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ action ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. System defined key bindings\n\t\tif( triggered === false ) {\n\n\t\t\t// Assume true and try to prove false\n\t\t\ttriggered = true;\n\n\t\t\t// P, PAGE UP\n\t\t\tif( keyCode === 80 || keyCode === 33 ) {\n\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// N, PAGE DOWN\n\t\t\telse if( keyCode === 78 || keyCode === 34 ) {\n\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// H, LEFT\n\t\t\telse if( keyCode === 72 || keyCode === 37 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.left({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// L, RIGHT\n\t\t\telse if( keyCode === 76 || keyCode === 39 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.right({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// K, UP\n\t\t\telse if( keyCode === 75 || keyCode === 38 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.up({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// J, DOWN\n\t\t\telse if( keyCode === 74 || keyCode === 40 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, Number.MAX_VALUE );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.down({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// HOME\n\t\t\telse if( keyCode === 36 ) {\n\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t}\n\t\t\t// END\n\t\t\telse if( keyCode === 35 ) {\n\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t}\n\t\t\t// SPACE\n\t\t\telse if( keyCode === 32 ) {\n\t\t\t\tif( this.Reveal.overview.isActive() ) {\n\t\t\t\t\tthis.Reveal.overview.deactivate();\n\t\t\t\t}\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS \"BLACK SCREEN\" BUTTON\n\t\t\telse if( [58, 59, 66, 86, 190].includes( keyCode ) || ( keyCode === 191 && !event.shiftKey ) ) {\n\t\t\t\tthis.Reveal.togglePause();\n\t\t\t}\n\t\t\t// F\n\t\t\telse if( keyCode === 70 ) {\n\t\t\t\tenterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );\n\t\t\t}\n\t\t\t// A\n\t\t\telse if( keyCode === 65 ) {\n\t\t\t\tif( config.autoSlideStoppable ) {\n\t\t\t\t\tthis.Reveal.toggleAutoSlide( autoSlideWasPaused );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// G\n\t\t\telse if( keyCode === 71 ) {\n\t\t\t\tif( config.jumpToSlide ) {\n\t\t\t\t\tthis.Reveal.toggleJumpToSlide();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// C\n\t\t\telse if( keyCode === 67 && this.Reveal.isOverlayOpen() ) {\n\t\t\t\tthis.Reveal.closeOverlay();\n\t\t\t}\n\t\t\t// ?\n\t\t\telse if( ( keyCode === 63 || keyCode === 191 ) && event.shiftKey ) {\n\t\t\t\tthis.Reveal.toggleHelp();\n\t\t\t}\n\t\t\t// F1\n\t\t\telse if( keyCode === 112 ) {\n\t\t\t\tthis.Reveal.toggleHelp();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttriggered = false;\n\t\t\t}\n\n\t\t}\n\n\t\t// If the input resulted in a triggered action we should prevent\n\t\t// the browsers default behavior\n\t\tif( triggered ) {\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t// ESC or O key\n\t\telse if( keyCode === 27 || keyCode === 79 ) {\n\t\t\tif( this.Reveal.closeOverlay() === false ) {\n\t\t\t\tthis.Reveal.overview.toggle();\n\t\t\t}\n\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t\n\t\t// Enter to exit overview mode\n\t\telse if (keyCode === 13 && this.Reveal.overview.isActive()) {\n\t\t\tthis.Reveal.overview.deactivate();\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\n\t\t// If auto-sliding is enabled we need to cue up\n\t\t// another timeout\n\t\tthis.Reveal.cueAutoSlide();\n\n\t}\n\n}\n","/**\n * Reads and writes the URL based on reveal.js' current state.\n */\nexport default class Location {\n\n\t// The minimum number of milliseconds that must pass between\n\t// calls to history.replaceState\n\tMAX_REPLACE_STATE_FREQUENCY = 1000\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Delays updates to the URL due to a Chrome thumbnailer bug\n\t\tthis.writeURLTimeout = 0;\n\n\t\tthis.replaceStateTimestamp = 0;\n\n\t\tthis.onWindowHashChange = this.onWindowHashChange.bind( this );\n\n\t}\n\n\tbind() {\n\n\t\twindow.addEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\tunbind() {\n\n\t\twindow.removeEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\t/**\n\t * Returns the slide indices for the given hash link.\n\t *\n\t * @param {string} [hash] the hash string that we want to\n\t * find the indices for\n\t *\n\t * @returns slide indices or null\n\t */\n\tgetIndicesFromHash( hash=window.location.hash, options={} ) {\n\n\t\t// Attempt to parse the hash as either an index or name\n\t\tlet name = hash.replace( /^#\\/?/, '' );\n\t\tlet bits = name.split( '/' );\n\n\t\t// If the first bit is not fully numeric and there is a name we\n\t\t// can assume that this is a named link\n\t\tif( !/^[0-9]*$/.test( bits[0] ) && name.length ) {\n\t\t\tlet slide;\n\n\t\t\tlet f;\n\n\t\t\t// Parse named links with fragments (#/named-link/2)\n\t\t\tif( /\\/[-\\d]+$/g.test( name ) ) {\n\t\t\t\tf = parseInt( name.split( '/' ).pop(), 10 );\n\t\t\t\tf = isNaN(f) ? undefined : f;\n\t\t\t\tname = name.split( '/' ).shift();\n\t\t\t}\n\n\t\t\t// Ensure the named link is a valid HTML ID attribute\n\t\t\ttry {\n\t\t\t\tslide = document\n\t\t\t\t\t.getElementById( decodeURIComponent( name ) )\n\t\t\t\t\t.closest('.slides section');\n\t\t\t}\n\t\t\tcatch ( error ) { }\n\n\t\t\tif( slide ) {\n\t\t\t\treturn { ...this.Reveal.getIndices( slide ), f };\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst config = this.Reveal.getConfig();\n\t\t\tlet hashIndexBase = config.hashOneBasedIndex || options.oneBasedIndex ? 1 : 0;\n\n\t\t\t// Read the index components of the hash\n\t\t\tlet h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tv = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tf;\n\n\t\t\tif( config.fragmentInURL ) {\n\t\t\t\tf = parseInt( bits[2], 10 );\n\t\t\t\tif( isNaN( f ) ) {\n\t\t\t\t\tf = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { h, v, f };\n\t\t}\n\n\t\t// The hash couldn't be parsed or no matching named link was found\n\t\treturn null\n\n\t}\n\n\t/**\n\t * Reads the current URL (hash) and navigates accordingly.\n\t */\n\treadURL() {\n\n\t\tconst currentIndices = this.Reveal.getIndices();\n\t\tconst newIndices = this.getIndicesFromHash();\n\n\t\tif( newIndices ) {\n\t\t\tif( ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) {\n\t\t\t\t\tthis.Reveal.slide( newIndices.h, newIndices.v, newIndices.f );\n\t\t\t}\n\t\t}\n\t\t// If no new indices are available, we're trying to navigate to\n\t\t// a slide hash that does not exist\n\t\telse {\n\t\t\tthis.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the page URL (hash) to reflect the current\n\t * state.\n\t *\n\t * @param {number} delay The time in ms to wait before\n\t * writing the hash\n\t */\n\twriteURL( delay ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\n\t\t// Make sure there's never more than one timeout running\n\t\tclearTimeout( this.writeURLTimeout );\n\n\t\t// If a delay is specified, timeout this call\n\t\tif( typeof delay === 'number' ) {\n\t\t\tthis.writeURLTimeout = setTimeout( this.writeURL, delay );\n\t\t}\n\t\telse if( currentSlide ) {\n\n\t\t\tlet hash = this.getHash();\n\n\t\t\t// If we're configured to push to history OR the history\n\t\t\t// API is not available.\n\t\t\tif( config.history ) {\n\t\t\t\twindow.location.hash = hash;\n\t\t\t}\n\t\t\t// If we're configured to reflect the current slide in the\n\t\t\t// URL without pushing to history.\n\t\t\telse if( config.hash ) {\n\t\t\t\t// If the hash is empty, don't add it to the URL\n\t\t\t\tif( hash === '/' ) {\n\t\t\t\t\tthis.debouncedReplaceState( window.location.pathname + window.location.search );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.debouncedReplaceState( '#' + hash );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// UPDATE: The below nuking of all hash changes breaks\n\t\t\t// anchors on pages where reveal.js is running. Removed\n\t\t\t// in 4.0. Why was it here in the first place? ¯\\_(ツ)_/¯\n\t\t\t//\n\t\t\t// If history and hash are both disabled, a hash may still\n\t\t\t// be added to the URL by clicking on a href with a hash\n\t\t\t// target. Counter this by always removing the hash.\n\t\t\t// else {\n\t\t\t// \twindow.history.replaceState( null, null, window.location.pathname + window.location.search );\n\t\t\t// }\n\n\t\t}\n\n\t}\n\n\treplaceState( url ) {\n\n\t\twindow.history.replaceState( null, null, url );\n\t\tthis.replaceStateTimestamp = Date.now();\n\n\t}\n\n\tdebouncedReplaceState( url ) {\n\n\t\tclearTimeout( this.replaceStateTimeout );\n\n\t\tif( Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ) {\n\t\t\tthis.replaceState( url );\n\t\t}\n\t\telse {\n\t\t\tthis.replaceStateTimeout = setTimeout( () => this.replaceState( url ), this.MAX_REPLACE_STATE_FREQUENCY );\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a hash URL that will resolve to the given slide location.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to link to\n\t */\n\tgetHash( slide ) {\n\n\t\tlet url = '/';\n\n\t\t// Attempt to create a named link based on the slide's ID\n\t\tlet s = slide || this.Reveal.getCurrentSlide();\n\t\tlet id = s ? s.getAttribute( 'id' ) : null;\n\t\tif( id ) {\n\t\t\tid = encodeURIComponent( id );\n\t\t}\n\n\t\tlet index = this.Reveal.getIndices( slide );\n\t\tif( !this.Reveal.getConfig().fragmentInURL ) {\n\t\t\tindex.f = undefined;\n\t\t}\n\n\t\t// If the current slide has an ID, use that as a named link,\n\t\t// but we don't support named links with a fragment index\n\t\tif( typeof id === 'string' && id.length ) {\n\t\t\turl = '/' + id;\n\n\t\t\t// If there is also a fragment, append that at the end\n\t\t\t// of the named link, like: #/named-link/2\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\t\t// Otherwise use the /h/v index\n\t\telse {\n\t\t\tlet hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;\n\t\t\tif( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;\n\t\t\tif( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\t/**\n\t * Handler for the window level 'hashchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tonWindowHashChange( event ) {\n\n\t\tthis.readURL();\n\n\t}\n\n}","import { queryAll, enterFullscreen } from '../utils/util.js'\nimport { isAndroid } from '../utils/device.js'\n\n/**\n * Manages our presentation controls. This includes both\n * the built-in control arrows as well as event monitoring\n * of any elements within the presentation with either of the\n * following helper classes:\n * - .navigate-up\n * - .navigate-right\n * - .navigate-down\n * - .navigate-left\n * - .navigate-next\n * - .navigate-prev\n * - .enter-fullscreen\n */\nexport default class Controls {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );\n\t\tthis.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );\n\t\tthis.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );\n\t\tthis.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );\n\t\tthis.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );\n\t\tthis.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );\n\t\tthis.onEnterFullscreen = this.onEnterFullscreen.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tconst rtl = this.Reveal.getConfig().rtl;\n\t\tconst revealElement = this.Reveal.getRevealElement();\n\n\t\tthis.element = document.createElement( 'aside' );\n\t\tthis.element.className = 'controls';\n\t\tthis.element.innerHTML =\n\t\t\t`
\n\t\t\t
\n\t\t\t
\n\t\t\t
`;\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\t// There can be multiple instances of controls throughout the page\n\t\tthis.controlsLeft = queryAll( revealElement, '.navigate-left' );\n\t\tthis.controlsRight = queryAll( revealElement, '.navigate-right' );\n\t\tthis.controlsUp = queryAll( revealElement, '.navigate-up' );\n\t\tthis.controlsDown = queryAll( revealElement, '.navigate-down' );\n\t\tthis.controlsPrev = queryAll( revealElement, '.navigate-prev' );\n\t\tthis.controlsNext = queryAll( revealElement, '.navigate-next' );\n\t\tthis.controlsFullscreen = queryAll( revealElement, '.enter-fullscreen' );\n\n\t\t// The left, right and down arrows in the standard reveal.js controls\n\t\tthis.controlsRightArrow = this.element.querySelector( '.navigate-right' );\n\t\tthis.controlsLeftArrow = this.element.querySelector( '.navigate-left' );\n\t\tthis.controlsDownArrow = this.element.querySelector( '.navigate-down' );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = (\n\t\t\tconfig.controls &&\n\t\t\t(config.controls !== 'speaker-only' || this.Reveal.isSpeakerNotes())\n\t\t) ? 'block' : 'none';\n\n\t\tthis.element.setAttribute( 'data-controls-layout', config.controlsLayout );\n\t\tthis.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );\n\n\t}\n\n\tbind() {\n\n\t\t// Listen to both touch and click events, in case the device\n\t\t// supports both\n\t\tlet pointerEvents = [ 'touchstart', 'click' ];\n\n\t\t// Only support touch for Android, fixes double navigations in\n\t\t// stock browser. Use touchend for it to be considered a valid\n\t\t// user interaction (so we're allowed to autoplay media).\n\t\tif( isAndroid ) {\n\t\t\tpointerEvents = [ 'touchend' ];\n\t\t}\n\n\t\tpointerEvents.forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t\tthis.controlsFullscreen.forEach( el => el.addEventListener( eventName, this.onEnterFullscreen, false ) );\n\t\t} );\n\n\t}\n\n\tunbind() {\n\n\t\t[ 'touchstart', 'touchend', 'click' ].forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t\tthis.controlsFullscreen.forEach( el => el.removeEventListener( eventName, this.onEnterFullscreen, false ) );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of all control/navigation arrows.\n\t */\n\tupdate() {\n\n\t\tlet routes = this.Reveal.availableRoutes();\n\n\t\t// Remove the 'enabled' class from all directions\n\t\t[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {\n\t\t\tnode.classList.remove( 'enabled', 'fragmented' );\n\n\t\t\t// Set 'disabled' attribute on all directions\n\t\t\tnode.setAttribute( 'disabled', 'disabled' );\n\t\t} );\n\n\t\t// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons\n\t\tif( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Prev/next buttons\n\t\tif( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Highlight fragment directions\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide ) {\n\n\t\t\tlet fragmentsRoutes = this.Reveal.fragments.availableRoutes();\n\n\t\t\t// Always apply fragment decorator to prev/next buttons\n\t\t\tif( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\tif( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t\tconst isVerticalStack = this.Reveal.isVerticalSlide( currentSlide );\n\t\t\tconst hasVerticalSiblings = isVerticalStack &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentSlide.parentElement &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentSlide.parentElement.querySelectorAll( ':scope > section' ).length > 1;\n\n\t\t\t// Apply fragment decorators to directional buttons based on\n\t\t\t// what slide axis they are in\n\t\t\tif( isVerticalStack && hasVerticalSiblings ) {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\n\t\t}\n\n\t\tif( this.Reveal.getConfig().controlsTutorial ) {\n\n\t\t\tlet indices = this.Reveal.getIndices();\n\n\t\t\t// Highlight control arrows with an animation to ensure\n\t\t\t// that the viewer knows how to navigate\n\t\t\tif( !this.Reveal.hasNavigatedVertically() && routes.down ) {\n\t\t\t\tthis.controlsDownArrow.classList.add( 'highlight' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.controlsDownArrow.classList.remove( 'highlight' );\n\n\t\t\t\tif( this.Reveal.getConfig().rtl ) {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\n\t\tthis.unbind();\n\t\tthis.element.remove();\n\n\t}\n\n\t/**\n\t * Event handlers for navigation control buttons.\n\t */\n\tonNavigateLeftClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.prev();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.left();\n\t\t}\n\n\t}\n\n\tonNavigateRightClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.next();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.right();\n\t\t}\n\n\t}\n\n\tonNavigateUpClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.up();\n\n\t}\n\n\tonNavigateDownClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.down();\n\n\t}\n\n\tonNavigatePrevClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.prev();\n\n\t}\n\n\tonNavigateNextClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.next();\n\n\t}\n\n\tonEnterFullscreen( event ) {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst viewport = this.Reveal.getViewportElement();\n\n\t\tenterFullscreen( config.embedded ? viewport : viewport.parentElement );\n\n\t}\n\n}","/**\n * Creates a visual progress bar for the presentation.\n */\nexport default class Progress {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onProgressClicked = this.onProgressClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'progress';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\tthis.bar = document.createElement( 'span' );\n\t\tthis.element.appendChild( this.bar );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.progress ? 'block' : 'none';\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.addEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tif ( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.removeEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the progress bar to reflect the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update progress if enabled\n\t\tif( this.Reveal.getConfig().progress && this.bar ) {\n\n\t\t\tlet scale = this.Reveal.getProgress();\n\n\t\t\t// Don't fill the progress bar if there's only one slide\n\t\t\tif( this.Reveal.getTotalSlides() < 2 ) {\n\t\t\t\tscale = 0;\n\t\t\t}\n\n\t\t\tthis.bar.style.transform = 'scaleX('+ scale +')';\n\n\t\t}\n\n\t}\n\n\tgetMaxWidth() {\n\n\t\treturn this.Reveal.getRevealElement().offsetWidth;\n\n\t}\n\n\t/**\n\t * Clicking on the progress bar results in a navigation to the\n\t * closest approximate horizontal slide using this equation:\n\t *\n\t * ( clickX / presentationWidth ) * numberOfSlides\n\t *\n\t * @param {object} event\n\t */\n\tonProgressClicked( event ) {\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\tevent.preventDefault();\n\n\t\tlet slides = this.Reveal.getSlides();\n\t\tlet slidesTotal = slides.length;\n\t\tlet slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );\n\n\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\tslideIndex = slidesTotal - slideIndex;\n\t\t}\n\n\t\tlet targetIndices = this.Reveal.getIndices(slides[slideIndex]);\n\t\tthis.Reveal.slide( targetIndices.h, targetIndices.v );\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * Handles hiding of the pointer/cursor when inactive.\n */\nexport default class Pointer {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Throttles mouse wheel navigation\n\t\tthis.lastMouseWheelStep = 0;\n\n\t\t// Is the mouse pointer currently hidden from view\n\t\tthis.cursorHidden = false;\n\n\t\t// Timeout used to determine when the cursor is inactive\n\t\tthis.cursorInactiveTimeout = 0;\n\n\t\tthis.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );\n\t\tthis.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.mouseWheel ) {\n\t\t\tdocument.addEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\t\telse {\n\t\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\n\t\t// Auto-hide the mouse pointer when its inactive\n\t\tif( config.hideInactiveCursor ) {\n\t\t\tdocument.addEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.addEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\t\telse {\n\t\t\tthis.showCursor();\n\n\t\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Shows the mouse pointer after it has been hidden with\n\t * #hideCursor.\n\t */\n\tshowCursor() {\n\n\t\tif( this.cursorHidden ) {\n\t\t\tthis.cursorHidden = false;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = '';\n\t\t}\n\n\t}\n\n\t/**\n\t * Hides the mouse pointer when it's on top of the .reveal\n\t * container.\n\t */\n\thideCursor() {\n\n\t\tif( this.cursorHidden === false ) {\n\t\t\tthis.cursorHidden = true;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = 'none';\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.showCursor();\n\n\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\n\t}\n\n\t/**\n\t * Called whenever there is mouse input at the document level\n\t * to determine if the cursor is active or not.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentCursorActive( event ) {\n\n\t\tthis.showCursor();\n\n\t\tclearTimeout( this.cursorInactiveTimeout );\n\n\t\tthis.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );\n\n\t}\n\n\t/**\n\t * Handles mouse wheel scrolling, throttled to avoid skipping\n\t * multiple slides.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentMouseScroll( event ) {\n\n\t\tif( Date.now() - this.lastMouseWheelStep > 1000 ) {\n\n\t\t\tthis.lastMouseWheelStep = Date.now();\n\n\t\t\tlet delta = event.detail || -event.wheelDelta;\n\t\t\tif( delta > 0 ) {\n\t\t\t\tthis.Reveal.next();\n\t\t\t}\n\t\t\telse if( delta < 0 ) {\n\t\t\t\tthis.Reveal.prev();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","/**\n * Loads a JavaScript file from the given URL and executes it.\n *\n * @param {string} url Address of the .js file to load\n * @param {function} callback Method to invoke when the script\n * has loaded and executed\n */\nexport const loadScript = ( url, callback ) => {\n\n\tconst script = document.createElement( 'script' );\n\tscript.type = 'text/javascript';\n\tscript.async = false;\n\tscript.defer = false;\n\tscript.src = url;\n\n\tif( typeof callback === 'function' ) {\n\n\t\t// Success callback\n\t\tscript.onload = script.onreadystatechange = event => {\n\t\t\tif( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t// Kill event listeners\n\t\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\t\tcallback();\n\n\t\t\t}\n\t\t};\n\n\t\t// Error callback\n\t\tscript.onerror = err => {\n\n\t\t\t// Kill event listeners\n\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\tcallback( new Error( 'Failed loading script: ' + script.src + '\\n' + err ) );\n\n\t\t};\n\n\t}\n\n\t// Append the script at the end of \n\tconst head = document.querySelector( 'head' );\n\thead.insertBefore( script, head.lastChild );\n\n}","import { loadScript } from '../utils/loader.js'\n\n/**\n * Manages loading and registering of reveal.js plugins.\n */\nexport default class Plugins {\n\n\tconstructor( reveal ) {\n\n\t\tthis.Reveal = reveal;\n\n\t\t// Flags our current state (idle -> loading -> loaded)\n\t\tthis.state = 'idle';\n\n\t\t// An id:instance map of currently registered plugins\n\t\tthis.registeredPlugins = {};\n\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n\t/**\n\t * Loads reveal.js dependencies, registers and\n\t * initializes plugins.\n\t *\n\t * Plugins are direct references to a reveal.js plugin\n\t * object that we register and initialize after any\n\t * synchronous dependencies have loaded.\n\t *\n\t * Dependencies are defined via the 'dependencies' config\n\t * option and will be loaded prior to starting reveal.js.\n\t * Some dependencies may have an 'async' flag, if so they\n\t * will load after reveal.js has been started up.\n\t */\n\tload( plugins, dependencies ) {\n\n\t\tthis.state = 'loading';\n\n\t\tplugins.forEach( this.registerPlugin.bind( this ) );\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet scripts = [],\n\t\t\t\tscriptsToLoad = 0;\n\n\t\t\tdependencies.forEach( s => {\n\t\t\t\t// Load if there's no condition or the condition is truthy\n\t\t\t\tif( !s.condition || s.condition() ) {\n\t\t\t\t\tif( s.async ) {\n\t\t\t\t\t\tthis.asyncDependencies.push( s );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscripts.push( s );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( scripts.length ) {\n\t\t\t\tscriptsToLoad = scripts.length;\n\n\t\t\t\tconst scriptLoadedCallback = (s) => {\n\t\t\t\t\tif( s && typeof s.callback === 'function' ) s.callback();\n\n\t\t\t\t\tif( --scriptsToLoad === 0 ) {\n\t\t\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Load synchronous scripts\n\t\t\t\tscripts.forEach( s => {\n\t\t\t\t\tif( typeof s.id === 'string' ) {\n\t\t\t\t\t\tthis.registerPlugin( s );\n\t\t\t\t\t\tscriptLoadedCallback( s );\n\t\t\t\t\t}\n\t\t\t\t\telse if( typeof s.src === 'string' ) {\n\t\t\t\t\t\tloadScript( s.src, () => scriptLoadedCallback(s) );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn( 'Unrecognized plugin format', s );\n\t\t\t\t\t\tscriptLoadedCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Initializes our plugins and waits for them to be ready\n\t * before proceeding.\n\t */\n\tinitPlugins() {\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet pluginValues = Object.values( this.registeredPlugins );\n\t\t\tlet pluginsToInitialize = pluginValues.length;\n\n\t\t\t// If there are no plugins, skip this step\n\t\t\tif( pluginsToInitialize === 0 ) {\n\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t}\n\t\t\t// ... otherwise initialize plugins\n\t\t\telse {\n\n\t\t\t\tlet initNextPlugin;\n\n\t\t\t\tlet afterPlugInitialized = () => {\n\t\t\t\t\tif( --pluginsToInitialize === 0 ) {\n\t\t\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinitNextPlugin();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// Initialize plugins serially\n\t\t\t\tinitNextPlugin = () => {\n\n\t\t\t\t\tlet plugin = pluginValues[i++];\n\n\t\t\t\t\t// If the plugin has an 'init' method, invoke it\n\t\t\t\t\tif( typeof plugin.init === 'function' ) {\n\t\t\t\t\t\tlet promise = plugin.init( this.Reveal );\n\n\t\t\t\t\t\t// If the plugin returned a Promise, wait for it\n\t\t\t\t\t\tif( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\t\tpromise.then( afterPlugInitialized );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tinitNextPlugin();\n\n\t\t\t}\n\n\t\t} )\n\n\t}\n\n\t/**\n\t * Loads all async reveal.js dependencies.\n\t */\n\tloadAsync() {\n\n\t\tthis.state = 'loaded';\n\n\t\tif( this.asyncDependencies.length ) {\n\t\t\tthis.asyncDependencies.forEach( s => {\n\t\t\t\tloadScript( s.src, s.callback );\n\t\t\t} );\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n\t/**\n\t * Registers a new plugin with this reveal.js instance.\n\t *\n\t * reveal.js waits for all registered plugins to initialize\n\t * before considering itself ready, as long as the plugin\n\t * is registered before calling `Reveal.initialize()`.\n\t */\n\tregisterPlugin( plugin ) {\n\n\t\t// Backwards compatibility to make reveal.js ~3.9.0\n\t\t// plugins work with reveal.js 4.0.0\n\t\tif( arguments.length === 2 && typeof arguments[0] === 'string' ) {\n\t\t\tplugin = arguments[1];\n\t\t\tplugin.id = arguments[0];\n\t\t}\n\t\t// Plugin can optionally be a function which we call\n\t\t// to create an instance of the plugin\n\t\telse if( typeof plugin === 'function' ) {\n\t\t\tplugin = plugin();\n\t\t}\n\n\t\tlet id = plugin.id;\n\n\t\tif( typeof id !== 'string' ) {\n\t\t\tconsole.warn( 'Unrecognized plugin format; can\\'t find plugin.id', plugin );\n\t\t}\n\t\telse if( this.registeredPlugins[id] === undefined ) {\n\t\t\tthis.registeredPlugins[id] = plugin;\n\n\t\t\t// If a plugin is registered after reveal.js is loaded,\n\t\t\t// initialize it right away\n\t\t\tif( this.state === 'loaded' && typeof plugin.init === 'function' ) {\n\t\t\t\tplugin.init( this.Reveal );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.warn( 'reveal.js: \"'+ id +'\" plugin has already been registered' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if a specific plugin has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\thasPlugin( id ) {\n\n\t\treturn !!this.registeredPlugins[id];\n\n\t}\n\n\t/**\n\t * Returns the specific plugin instance, if a plugin\n\t * with the given ID has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\tgetPlugin( id ) {\n\n\t\treturn this.registeredPlugins[id];\n\n\t}\n\n\tgetRegisteredPlugins() {\n\n\t\treturn this.registeredPlugins;\n\n\t}\n\n\tdestroy() {\n\n\t\tObject.values( this.registeredPlugins ).forEach( plugin => {\n\t\t\tif( typeof plugin.destroy === 'function' ) {\n\t\t\t\tplugin.destroy();\n\t\t\t}\n\t\t} );\n\n\t\tthis.registeredPlugins = {};\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n}\n","/**\n * Handles the display of reveal.js' overlay elements used\n * to preview iframes, images & videos.\n */\nexport default class Overlay {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onSlidesClicked = this.onSlidesClicked.bind( this );\n\n\t\tthis.iframeTriggerSelector = null;\n\t\tthis.mediaTriggerSelector = '[data-preview-image], [data-preview-video]';\n\n\t\tthis.stateProps = ['previewIframe', 'previewImage', 'previewVideo', 'previewFit'];\n\t\tthis.state = {};\n\n\t}\n\n\tupdate() {\n\n\t\t// Enable link previews globally\n\t\tif( this.Reveal.getConfig().previewLinks ) {\n\t\t\tthis.iframeTriggerSelector = 'a[href]:not([data-preview-link=false]), [data-preview-link]:not(a):not([data-preview-link=false])';\n\t\t}\n\t\t// Enable link previews for individual elements\n\t\telse {\n\t\t\tthis.iframeTriggerSelector = '[data-preview-link]:not([data-preview-link=false])';\n\t\t}\n\n\t\tconst hasLinkPreviews = this.Reveal.getSlidesElement().querySelectorAll( this.iframeTriggerSelector ).length > 0;\n\t\tconst hasMediaPreviews = this.Reveal.getSlidesElement().querySelectorAll( this.mediaTriggerSelector ).length > 0;\n\n\t\t// Only add the listener when there are previewable elements in the slides\n\t\tif( hasLinkPreviews || hasMediaPreviews ) {\n\t\t\tthis.Reveal.getSlidesElement().addEventListener( 'click', this.onSlidesClicked, false );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getSlidesElement().removeEventListener( 'click', this.onSlidesClicked, false );\n\t\t}\n\n\t}\n\n\tcreateOverlay( className ) {\n\n\t\tthis.dom = document.createElement( 'div' );\n\t\tthis.dom.classList.add( 'r-overlay' );\n\t\tthis.dom.classList.add( className );\n\n\t\tthis.viewport = document.createElement( 'div' );\n\t\tthis.viewport.classList.add( 'r-overlay-viewport' );\n\n\t\tthis.dom.appendChild( this.viewport );\n\t\tthis.Reveal.getRevealElement().appendChild( this.dom );\n\n\t}\n\n\t/**\n\t * Opens a lightbox that previews the target URL.\n\t *\n\t * @param {string} url - url for lightbox iframe src\n\t */\n\tpreviewIframe( url ) {\n\n\t\tthis.close();\n\n\t\tthis.state = { previewIframe: url };\n\n\t\tthis.createOverlay( 'r-overlay-preview' );\n\t\tthis.dom.dataset.state = 'loading';\n\n\t\tthis.viewport.innerHTML =\n\t\t\t`\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options). \n\t\t\t\t \n\t\t\t
`;\n\n\t\tthis.dom.querySelector( 'iframe' ).addEventListener( 'load', event => {\n\t\t\tthis.dom.dataset.state = 'loaded';\n\t\t}, false );\n\n\t\tthis.dom.querySelector( '.r-overlay-close' ).addEventListener( 'click', event => {\n\t\t\tthis.close();\n\t\t\tevent.preventDefault();\n\t\t}, false );\n\n\t\tthis.dom.querySelector( '.r-overlay-external' ).addEventListener( 'click', event => {\n\t\t\tthis.close();\n\t\t}, false );\n\n\t\tthis.Reveal.dispatchEvent({ type: 'previewiframe', data: { url } });\n\n\t}\n\n\t/**\n\t * Opens a lightbox window that provides a larger view of the\n\t * given image/video.\n\t *\n\t * @param {string} url - url to the image/video to preview\n\t * @param {image|video} mediaType\n\t * @param {string} [fitMode] - the fit mode to use for the preview\n\t */\n\tpreviewMedia( url, mediaType, fitMode ) {\n\n\t\tif( mediaType !== 'image' && mediaType !== 'video' ) {\n\t\t\tconsole.warn( 'Please specify a valid media type to preview (image|video)' );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.close();\n\n\t\tfitMode = fitMode || 'scale-down';\n\n\t\tthis.createOverlay( 'r-overlay-preview' );\n\t\tthis.dom.dataset.state = 'loading';\n\t\tthis.dom.dataset.previewFit = fitMode;\n\n\t\tthis.viewport.innerHTML =\n\t\t\t`\n\t\t\t
\n\t\t\t
`;\n\n\t\tconst contentElement = this.dom.querySelector( '.r-overlay-content' );\n\n\t\tif( mediaType === 'image' ) {\n\n\t\t\tthis.state = { previewImage: url, previewFit: fitMode }\n\n\t\t\tconst img = document.createElement( 'img', {} );\n\t\t\timg.src = url;\n\t\t\tcontentElement.appendChild( img );\n\n\t\t\timg.addEventListener( 'load', () => {\n\t\t\t\tthis.dom.dataset.state = 'loaded';\n\t\t\t}, false );\n\n\t\t\timg.addEventListener( 'error', () => {\n\t\t\t\tthis.dom.dataset.state = 'error';\n\t\t\t\tcontentElement.innerHTML =\n\t\t\t\t\t\t`Unable to load image. `\n\t\t\t}, false );\n\n\t\t\t// Hide image overlays when clicking outside the overlay\n\t\t\tthis.dom.style.cursor = 'zoom-out';\n\t\t\tthis.dom.addEventListener( 'click', ( event ) => {\n\t\t\t\tthis.close();\n\t\t\t}, false );\n\n\t\t\tthis.Reveal.dispatchEvent({ type: 'previewimage', data: { url } });\n\n\t\t}\n\t\telse if( mediaType === 'video' ) {\n\n\t\t\tthis.state = { previewVideo: url, previewFit: fitMode }\n\n\t\t\tconst video = document.createElement( 'video' );\n\t\t\tvideo.autoplay = this.dom.dataset.previewAutoplay === 'false' ? false : true;\n\t\t\tvideo.controls = this.dom.dataset.previewControls === 'false' ? false : true;\n\t\t\tvideo.loop = this.dom.dataset.previewLoop === 'true' ? true : false;\n\t\t\tvideo.muted = this.dom.dataset.previewMuted === 'true' ? true : false;\n\t\t\tvideo.playsInline = true;\n\t\t\tvideo.src = url;\n\t\t\tcontentElement.appendChild( video );\n\n\t\t\tvideo.addEventListener( 'loadeddata', () => {\n\t\t\t\tthis.dom.dataset.state = 'loaded';\n\t\t\t}, false );\n\n\t\t\tvideo.addEventListener( 'error', () => {\n\t\t\t\tthis.dom.dataset.state = 'error';\n\t\t\t\tcontentElement.innerHTML =\n\t\t\t\t\t`Unable to load video. `;\n\t\t\t}, false );\n\n\t\t\tthis.Reveal.dispatchEvent({ type: 'previewvideo', data: { url } });\n\n\t\t}\n\t\telse {\n\t\t\tthrow new Error( 'Please specify a valid media type to preview' );\n\t\t}\n\n\t\tthis.dom.querySelector( '.r-overlay-close' ).addEventListener( 'click', ( event ) => {\n\t\t\tthis.close();\n\t\t\tevent.preventDefault();\n\t\t}, false );\n\n\t}\n\n\tpreviewImage( url, fitMode ) {\n\n\t\tthis.previewMedia( url, 'image', fitMode );\n\n\t}\n\n\tpreviewVideo( url, fitMode ) {\n\n\t\tthis.previewMedia( url, 'video', fitMode );\n\n\t}\n\n\t/**\n\t * Open or close help overlay window.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * help is open, false means it's closed.\n\t */\n\ttoggleHelp( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.showHelp() : this.close();\n\t\t}\n\t\telse {\n\t\t\tif( this.dom ) {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.showHelp();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Opens an overlay window with help material.\n\t */\n\tshowHelp() {\n\n\t\tif( this.Reveal.getConfig().help ) {\n\n\t\t\tthis.close();\n\n\t\t\tthis.createOverlay( 'r-overlay-help' );\n\n\t\t\tlet html = 'Keyboard Shortcuts
';\n\n\t\t\tlet shortcuts = this.Reveal.keyboard.getShortcuts(),\n\t\t\t\tbindings = this.Reveal.keyboard.getBindings();\n\n\t\t\thtml += 'KEY ACTION ';\n\t\t\tfor( let key in shortcuts ) {\n\t\t\t\thtml += `${key} ${shortcuts[ key ]} `;\n\t\t\t}\n\n\t\t\t// Add custom key bindings that have associated descriptions\n\t\t\tfor( let binding in bindings ) {\n\t\t\t\tif( bindings[binding].key && bindings[binding].description ) {\n\t\t\t\t\thtml += `${bindings[binding].key} ${bindings[binding].description} `;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thtml += '
';\n\n\t\t\tthis.viewport.innerHTML = `\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t
${html}
\n\t\t\t\t
\n\t\t\t`;\n\n\t\t\tthis.dom.querySelector( '.r-overlay-close' ).addEventListener( 'click', event => {\n\t\t\t\tthis.close();\n\t\t\t\tevent.preventDefault();\n\t\t\t}, false );\n\n\t\t\tthis.Reveal.dispatchEvent({ type: 'showhelp' });\n\n\t\t}\n\n\t}\n\n\tisOpen() {\n\n\t\treturn !!this.dom;\n\n\t}\n\n\t/**\n\t * Closes any currently open overlay.\n\t */\n\tclose() {\n\n\t\tif( this.dom ) {\n\t\t\tthis.dom.remove();\n\t\t\tthis.dom = null;\n\n\t\t\tthis.state = {};\n\n\t\t\tthis.Reveal.dispatchEvent({ type: 'closeoverlay' });\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tgetState() {\n\n\t\treturn this.state;\n\n\t}\n\n\tsetState( state ) {\n\n\t\t// Ignore the incoming state if none of the preview related\n\t\t// props have changed\n\t\tif( this.stateProps.every( key => this.state[ key ] === state[ key ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif( state.previewIframe ) {\n\t\t\tthis.previewIframe( state.previewIframe );\n\t\t}\n\t\telse if( state.previewImage ) {\n\t\t\tthis.previewImage( state.previewImage, state.previewFit );\n\t\t}\n\t\telse if( state.previewVideo ) {\n\t\t\tthis.previewVideo( state.previewVideo, state.previewFit );\n\t\t}\n\t\telse {\n\t\t\tthis.close();\n\t\t}\n\n\t}\n\n\tonSlidesClicked( event ) {\n\n\t\tconst target = event.target;\n\n\t\tconst linkTarget = target.closest( this.iframeTriggerSelector );\n\t\tconst mediaTarget = target.closest( this.mediaTriggerSelector );\n\n\t\t// Was an iframe lightbox trigger clicked?\n\t\tif( linkTarget ) {\n\t\t\tif( event.metaKey || event.shiftKey || event.altKey ) {\n\t\t\t\t// Let the browser handle meta keys naturally so users can cmd+click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet url = linkTarget.getAttribute( 'href' ) || linkTarget.getAttribute( 'data-preview-link' );\n\t\t\tif( url ) {\n\t\t\t\tthis.previewIframe( url );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\t// Was a media lightbox trigger clicked?\n\t\telse if( mediaTarget ) {\n\t\t\tif( mediaTarget.hasAttribute( 'data-preview-image' ) ) {\n\t\t\t\tlet url = mediaTarget.dataset.previewImage || mediaTarget.getAttribute( 'src' );\n\t\t\t\tif( url ) {\n\t\t\t\t\tthis.previewImage( url, mediaTarget.dataset.previewFit );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( mediaTarget.hasAttribute( 'data-preview-video' ) ) {\n\t\t\t\tlet url = mediaTarget.dataset.previewVideo || mediaTarget.getAttribute( 'src' );\n\t\t\t\tif( !url ) {\n\t\t\t\t\tlet source = mediaTarget.querySelector( 'source' );\n\t\t\t\t\tif( source ) {\n\t\t\t\t\t\turl = source.getAttribute( 'src' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif( url ) {\n\t\t\t\t\tthis.previewVideo( url, mediaTarget.dataset.previewFit );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.close();\n\n\t}\n\n}","import { isAndroid } from '../utils/device.js'\nimport { matches } from '../utils/util.js'\n\nconst SWIPE_THRESHOLD = 40;\n\n/**\n * Controls all touch interactions and navigations for\n * a presentation.\n */\nexport default class Touch {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Holds information about the currently ongoing touch interaction\n\t\tthis.touchStartX = 0;\n\t\tthis.touchStartY = 0;\n\t\tthis.touchStartCount = 0;\n\t\tthis.touchCaptured = false;\n\n\t\tthis.onPointerDown = this.onPointerDown.bind( this );\n\t\tthis.onPointerMove = this.onPointerMove.bind( this );\n\t\tthis.onPointerUp = this.onPointerUp.bind( this );\n\t\tthis.onTouchStart = this.onTouchStart.bind( this );\n\t\tthis.onTouchMove = this.onTouchMove.bind( this );\n\t\tthis.onTouchEnd = this.onTouchEnd.bind( this );\n\n\t}\n\n\t/**\n\t *\n\t */\n\tbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\tif( 'onpointerdown' in window ) {\n\t\t\t// Use W3C pointer events\n\t\t\trevealElement.addEventListener( 'pointerdown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'pointermove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'pointerup', this.onPointerUp, false );\n\t\t}\n\t\telse if( window.navigator.msPointerEnabled ) {\n\t\t\t// IE 10 uses prefixed version of pointer events\n\t\t\trevealElement.addEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'MSPointerUp', this.onPointerUp, false );\n\t\t}\n\t\telse {\n\t\t\t// Fall back to touch events\n\t\t\trevealElement.addEventListener( 'touchstart', this.onTouchStart, false );\n\t\t\trevealElement.addEventListener( 'touchmove', this.onTouchMove, false );\n\t\t\trevealElement.addEventListener( 'touchend', this.onTouchEnd, false );\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tunbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\trevealElement.removeEventListener( 'pointerdown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'pointermove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'pointerup', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'MSPointerUp', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'touchstart', this.onTouchStart, false );\n\t\trevealElement.removeEventListener( 'touchmove', this.onTouchMove, false );\n\t\trevealElement.removeEventListener( 'touchend', this.onTouchEnd, false );\n\n\t}\n\n\t/**\n\t * Checks if the target element prevents the triggering of\n\t * swipe navigation.\n\t */\n\tisSwipePrevented( target ) {\n\n\t\t// Prevent accidental swipes when scrubbing timelines\n\t\tif( matches( target, 'video[controls], audio[controls]' ) ) return true;\n\n\t\twhile( target && typeof target.hasAttribute === 'function' ) {\n\t\t\tif( target.hasAttribute( 'data-prevent-swipe' ) ) return true;\n\t\t\ttarget = target.parentNode;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchstart' event, enables support for\n\t * swipe and pinch gestures.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchStart( event ) {\n\n\t\tthis.touchCaptured = false;\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tthis.touchStartX = event.touches[0].clientX;\n\t\tthis.touchStartY = event.touches[0].clientY;\n\t\tthis.touchStartCount = event.touches.length;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchmove' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchMove( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// Each touch should only trigger one action\n\t\tif( !this.touchCaptured ) {\n\t\t\tthis.Reveal.onUserInput( event );\n\n\t\t\tlet currentX = event.touches[0].clientX;\n\t\t\tlet currentY = event.touches[0].clientY;\n\n\t\t\t// There was only one touch point, look for a swipe\n\t\t\tif( event.touches.length === 1 && this.touchStartCount !== 2 ) {\n\n\t\t\t\tlet availableRoutes = this.Reveal.availableRoutes({ includeFragments: true });\n\n\t\t\t\tlet deltaX = currentX - this.touchStartX,\n\t\t\t\t\tdeltaY = currentY - this.touchStartY;\n\n\t\t\t\tif( deltaX > SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.left();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaX < -SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.right();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY > SWIPE_THRESHOLD && availableRoutes.up ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.up();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY < -SWIPE_THRESHOLD && availableRoutes.down ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.down();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we're embedded, only block touch events if they have\n\t\t\t\t// triggered an action\n\t\t\t\tif( config.embedded ) {\n\t\t\t\t\tif( this.touchCaptured || this.Reveal.isVerticalSlide() ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Not embedded? Block them all to avoid needless tossing\n\t\t\t\t// around of the viewport in iOS\n\t\t\t\telse {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t// There's a bug with swiping on some Android devices unless\n\t\t// the default action is always prevented\n\t\telse if( isAndroid ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the 'touchend' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchEnd( event ) {\n\n\t\t// Media playback is only allowed as a direct result of a\n\t\t// user interaction. Some mobile devices do not consider a\n\t\t// 'touchmove' to be a direct user action. If this is the\n\t\t// case, we fall back to starting playback here instead.\n\t\tif( this.touchCaptured && this.Reveal.slideContent.isNotAllowedToPlay() ) {\n\t\t\tthis.Reveal.startEmbeddedContent( this.Reveal.getCurrentSlide() );\n\t\t}\n\n\t\tthis.touchCaptured = false;\n\n\t}\n\n\t/**\n\t * Convert pointer down to touch start.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerDown( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchStart( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer move to touch move.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerMove( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchMove( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer up to touch end.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerUp( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchEnd( event );\n\t\t}\n\n\t}\n\n}","import { closest } from '../utils/util.js'\n\n/**\n * Manages focus when a presentation is embedded. This\n * helps us only capture keyboard from the presentation\n * a user is currently interacting with in a page where\n * multiple presentations are embedded.\n */\n\nconst STATE_FOCUS = 'focus';\nconst STATE_BLUR = 'blur';\n\nexport default class Focus {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onRevealPointerDown = this.onRevealPointerDown.bind( this );\n\t\tthis.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.embedded ) {\n\t\t\tthis.blur();\n\t\t}\n\t\telse {\n\t\t\tthis.focus();\n\t\t\tthis.unbind();\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().embedded ) {\n\t\t\tthis.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tthis.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\n\t}\n\n\tfocus() {\n\n\t\tif( this.state !== STATE_FOCUS ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'focused' );\n\t\t\tdocument.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_FOCUS;\n\n\t}\n\n\tblur() {\n\n\t\tif( this.state !== STATE_BLUR ) {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\t\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_BLUR;\n\n\t}\n\n\tisFocused() {\n\n\t\treturn this.state === STATE_FOCUS;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\n\t}\n\n\tonRevealPointerDown( event ) {\n\n\t\tthis.focus();\n\n\t}\n\n\tonDocumentPointerDown( event ) {\n\n\t\tlet revealElement = closest( event.target, '.reveal' );\n\t\tif( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {\n\t\t\tthis.blur();\n\t\t}\n\n\t}\n\n}","/**\n * Handles the showing of speaker notes\n */\nexport default class Notes {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'speaker-notes';\n\t\tthis.element.setAttribute( 'data-prevent-swipe', '' );\n\t\tthis.element.setAttribute( 'tabindex', '0' );\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.showNotes ) {\n\t\t\tthis.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Pick up notes from the current slide and display them\n\t * to the viewer.\n\t *\n\t * @see {@link config.showNotes}\n\t */\n\tupdate() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.element && this.Reveal.getCurrentSlide() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.element.innerHTML = this.getSlideNotes() || 'No notes on this slide. ';\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the visibility of the speaker notes sidebar that\n\t * is used to share annotated slides. The notes sidebar is\n\t * only visible if showNotes is true and there are notes on\n\t * one or more slides in the deck.\n\t */\n\tupdateVisibility() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.hasNotes() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'show-notes' );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'show-notes' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if there are speaker notes for ANY slide in the\n\t * presentation.\n\t */\n\thasNotes() {\n\n\t\treturn this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;\n\n\t}\n\n\t/**\n\t * Checks if this presentation is running inside of the\n\t * speaker notes window.\n\t *\n\t * @return {boolean}\n\t */\n\tisSpeakerNotesWindow() {\n\n\t\treturn !!window.location.search.match( /receiver/gi );\n\n\t}\n\n\t/**\n\t * Retrieves the speaker notes from a slide. Notes can be\n\t * defined in two ways:\n\t * 1. As a data-notes attribute on the slide \n\t * 2. With elements inside the slide\n\t *\n\t * @param {HTMLElement} [slide=currentSlide]\n\t * @return {(string|null)}\n\t */\n\tgetSlideNotes( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\t// Notes can be specified via the data-notes attribute...\n\t\tif( slide.hasAttribute( 'data-notes' ) ) {\n\t\t\treturn slide.getAttribute( 'data-notes' );\n\t\t}\n\n\t\t// ... or using elements\n\t\tlet notesElements = slide.querySelectorAll( 'aside.notes' );\n\t\tif( notesElements ) {\n\t\t\treturn Array.from(notesElements).map( notesElement => notesElement.innerHTML ).join( '\\n' );\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * UI component that lets the use control auto-slide\n * playback via play/pause.\n */\nexport default class Playback {\n\n\t/**\n\t * @param {HTMLElement} container The component will append\n\t * itself to this\n\t * @param {function} progressCheck A method which will be\n\t * called frequently to get the current playback progress on\n\t * a range of 0-1\n\t */\n\tconstructor( container, progressCheck ) {\n\n\t\t// Cosmetics\n\t\tthis.diameter = 100;\n\t\tthis.diameter2 = this.diameter/2;\n\t\tthis.thickness = 6;\n\n\t\t// Flags if we are currently playing\n\t\tthis.playing = false;\n\n\t\t// Current progress on a 0-1 range\n\t\tthis.progress = 0;\n\n\t\t// Used to loop the animation smoothly\n\t\tthis.progressOffset = 1;\n\n\t\tthis.container = container;\n\t\tthis.progressCheck = progressCheck;\n\n\t\tthis.canvas = document.createElement( 'canvas' );\n\t\tthis.canvas.className = 'playback';\n\t\tthis.canvas.width = this.diameter;\n\t\tthis.canvas.height = this.diameter;\n\t\tthis.canvas.style.width = this.diameter2 + 'px';\n\t\tthis.canvas.style.height = this.diameter2 + 'px';\n\t\tthis.context = this.canvas.getContext( '2d' );\n\n\t\tthis.container.appendChild( this.canvas );\n\n\t\tthis.render();\n\n\t}\n\n\tsetPlaying( value ) {\n\n\t\tconst wasPlaying = this.playing;\n\n\t\tthis.playing = value;\n\n\t\t// Start repainting if we weren't already\n\t\tif( !wasPlaying && this.playing ) {\n\t\t\tthis.animate();\n\t\t}\n\t\telse {\n\t\t\tthis.render();\n\t\t}\n\n\t}\n\n\tanimate() {\n\n\t\tconst progressBefore = this.progress;\n\n\t\tthis.progress = this.progressCheck();\n\n\t\t// When we loop, offset the progress so that it eases\n\t\t// smoothly rather than immediately resetting\n\t\tif( progressBefore > 0.8 && this.progress < 0.2 ) {\n\t\t\tthis.progressOffset = this.progress;\n\t\t}\n\n\t\tthis.render();\n\n\t\tif( this.playing ) {\n\t\t\trequestAnimationFrame( this.animate.bind( this ) );\n\t\t}\n\n\t}\n\n\t/**\n\t * Renders the current progress and playback state.\n\t */\n\trender() {\n\n\t\tlet progress = this.playing ? this.progress : 0,\n\t\t\tradius = ( this.diameter2 ) - this.thickness,\n\t\t\tx = this.diameter2,\n\t\t\ty = this.diameter2,\n\t\t\ticonSize = 28;\n\n\t\t// Ease towards 1\n\t\tthis.progressOffset += ( 1 - this.progressOffset ) * 0.1;\n\n\t\tconst endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) );\n\t\tconst startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) );\n\n\t\tthis.context.save();\n\t\tthis.context.clearRect( 0, 0, this.diameter, this.diameter );\n\n\t\t// Solid background color\n\t\tthis.context.beginPath();\n\t\tthis.context.arc( x, y, radius + 4, 0, Math.PI * 2, false );\n\t\tthis.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )';\n\t\tthis.context.fill();\n\n\t\t// Draw progress track\n\t\tthis.context.beginPath();\n\t\tthis.context.arc( x, y, radius, 0, Math.PI * 2, false );\n\t\tthis.context.lineWidth = this.thickness;\n\t\tthis.context.strokeStyle = 'rgba( 255, 255, 255, 0.2 )';\n\t\tthis.context.stroke();\n\n\t\tif( this.playing ) {\n\t\t\t// Draw progress on top of track\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc( x, y, radius, startAngle, endAngle, false );\n\t\t\tthis.context.lineWidth = this.thickness;\n\t\t\tthis.context.strokeStyle = '#fff';\n\t\t\tthis.context.stroke();\n\t\t}\n\n\t\tthis.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) );\n\n\t\t// Draw play/pause icons\n\t\tif( this.playing ) {\n\t\t\tthis.context.fillStyle = '#fff';\n\t\t\tthis.context.fillRect( 0, 0, iconSize / 2 - 4, iconSize );\n\t\t\tthis.context.fillRect( iconSize / 2 + 4, 0, iconSize / 2 - 4, iconSize );\n\t\t}\n\t\telse {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.translate( 4, 0 );\n\t\t\tthis.context.moveTo( 0, 0 );\n\t\t\tthis.context.lineTo( iconSize - 4, iconSize / 2 );\n\t\t\tthis.context.lineTo( 0, iconSize );\n\t\t\tthis.context.fillStyle = '#fff';\n\t\t\tthis.context.fill();\n\t\t}\n\n\t\tthis.context.restore();\n\n\t}\n\n\ton( type, listener ) {\n\t\tthis.canvas.addEventListener( type, listener, false );\n\t}\n\n\toff( type, listener ) {\n\t\tthis.canvas.removeEventListener( type, listener, false );\n\t}\n\n\tdestroy() {\n\n\t\tthis.playing = false;\n\n\t\tif( this.canvas.parentNode ) {\n\t\t\tthis.container.removeChild( this.canvas );\n\t\t}\n\n\t}\n\n}","/**\n * The default reveal.js config object.\n */\nexport default {\n\n\t// The \"normal\" size of the presentation, aspect ratio will be preserved\n\t// when the presentation is scaled to fit different resolutions\n\twidth: 960,\n\theight: 700,\n\n\t// Factor of the display size that should remain empty around the content\n\tmargin: 0.04,\n\n\t// Bounds for smallest/largest possible scale to apply to content\n\tminScale: 0.2,\n\tmaxScale: 2.0,\n\n\t// Display presentation control arrows.\n\t// - true: Display controls on all screens\n\t// - false: Hide controls on all screens\n\t// - \"speaker-only\": Only display controls in the speaker view\n\tcontrols: true,\n\n\t// Help the user learn the controls by providing hints, for example by\n\t// bouncing the down arrow when they first encounter a vertical slide\n\tcontrolsTutorial: true,\n\n\t// Determines where controls appear, \"edges\" or \"bottom-right\"\n\tcontrolsLayout: 'bottom-right',\n\n\t// Visibility rule for backwards navigation arrows; \"faded\", \"hidden\"\n\t// or \"visible\"\n\tcontrolsBackArrows: 'faded',\n\n\t// Display a presentation progress bar\n\tprogress: true,\n\n\t// Display the page number of the current slide\n\t// - true: Show slide number\n\t// - false: Hide slide number\n\t//\n\t// Can optionally be set as a string that specifies the number formatting:\n\t// - \"h.v\":\t Horizontal . vertical slide number (default)\n\t// - \"h/v\":\t Horizontal / vertical slide number\n\t// - \"c\":\t Flattened slide number\n\t// - \"c/t\":\t Flattened slide number / total slides\n\t//\n\t// Alternatively, you can provide a function that returns the slide\n\t// number for the current slide. The function should take in a slide\n\t// object and return an array with one string [slideNumber] or\n\t// three strings [n1,delimiter,n2]. See #formatSlideNumber().\n\tslideNumber: false,\n\n\t// Can be used to limit the contexts in which the slide number appears\n\t// - \"all\": Always show the slide number\n\t// - \"print\": Only when printing to PDF\n\t// - \"speaker\": Only in the speaker view\n\tshowSlideNumber: 'all',\n\n\t// Use 1 based indexing for # links to match slide number (default is zero\n\t// based)\n\thashOneBasedIndex: false,\n\n\t// Add the current slide number to the URL hash so that reloading the\n\t// page/copying the URL will return you to the same slide\n\thash: false,\n\n\t// Flags if we should monitor the hash and change slides accordingly\n\trespondToHashChanges: true,\n\n\t// Enable support for jump-to-slide navigation shortcuts\n\tjumpToSlide: true,\n\n\t// Push each slide change to the browser history. Implies `hash: true`\n\thistory: false,\n\n\t// Enable keyboard shortcuts for navigation\n\tkeyboard: true,\n\n\t// Optional function that blocks keyboard events when returning false\n\t//\n\t// If you set this to 'focused', we will only capture keyboard events\n\t// for embedded decks when they are in focus\n\tkeyboardCondition: null,\n\n\t// Disables the default reveal.js slide layout (scaling and centering)\n\t// so that you can use custom CSS layout\n\tdisableLayout: false,\n\n\t// Enable the slide overview mode\n\toverview: true,\n\n\t// Vertical centering of slides\n\tcenter: true,\n\n\t// Enables touch navigation on devices with touch input\n\ttouch: true,\n\n\t// Loop the presentation\n\tloop: false,\n\n\t// Change the presentation direction to be RTL\n\trtl: false,\n\n\t// Changes the behavior of our navigation directions.\n\t//\n\t// \"default\"\n\t// Left/right arrow keys step between horizontal slides, up/down\n\t// arrow keys step between vertical slides. Space key steps through\n\t// all slides (both horizontal and vertical).\n\t//\n\t// \"linear\"\n\t// Removes the up/down arrows. Left/right arrows step through all\n\t// slides (both horizontal and vertical).\n\t//\n\t// \"grid\"\n\t// When this is enabled, stepping left/right from a vertical stack\n\t// to an adjacent vertical stack will land you at the same vertical\n\t// index.\n\t//\n\t// Consider a deck with six slides ordered in two vertical stacks:\n\t// 1.1 2.1\n\t// 1.2 2.2\n\t// 1.3 2.3\n\t//\n\t// If you're on slide 1.3 and navigate right, you will normally move\n\t// from 1.3 -> 2.1. If \"grid\" is used, the same navigation takes you\n\t// from 1.3 -> 2.3.\n\tnavigationMode: 'default',\n\n\t// Randomizes the order of slides each time the presentation loads\n\tshuffle: false,\n\n\t// Turns fragments on and off globally\n\tfragments: true,\n\n\t// Flags whether to include the current fragment in the URL,\n\t// so that reloading brings you to the same fragment position\n\tfragmentInURL: true,\n\n\t// Flags if the presentation is running in an embedded mode,\n\t// i.e. contained within a limited portion of the screen\n\tembedded: false,\n\n\t// Flags if we should show a help overlay when the question-mark\n\t// key is pressed\n\thelp: true,\n\n\t// Flags if it should be possible to pause the presentation (blackout)\n\tpause: true,\n\n\t// Flags if speaker notes should be visible to all viewers\n\tshowNotes: false,\n\n\t// Flags if slides with data-visibility=\"hidden\" should be kep visible\n\tshowHiddenSlides: false,\n\n\t// Global override for autoplaying embedded media (video/audio/iframe)\n\t// - null: Media will only autoplay if data-autoplay is present\n\t// - true: All media will autoplay, regardless of individual setting\n\t// - false: No media will autoplay, regardless of individual setting\n\tautoPlayMedia: null,\n\n\t// Global override for preloading lazy-loaded iframes\n\t// - null: Iframes with data-src AND data-preload will be loaded when within\n\t// the viewDistance, iframes with only data-src will be loaded when visible\n\t// - true: All iframes with data-src will be loaded when within the viewDistance\n\t// - false: All iframes with data-src will be loaded only when visible\n\tpreloadIframes: null,\n\n\t// Prevent embedded iframes from automatically focusing on themselves\n\tpreventIframeAutoFocus: true,\n\n\t// Can be used to globally disable auto-animation\n\tautoAnimate: true,\n\n\t// Optionally provide a custom element matcher that will be\n\t// used to dictate which elements we can animate between.\n\tautoAnimateMatcher: null,\n\n\t// Default settings for our auto-animate transitions, can be\n\t// overridden per-slide or per-element via data arguments\n\tautoAnimateEasing: 'ease',\n\tautoAnimateDuration: 1.0,\n\tautoAnimateUnmatched: true,\n\n\t// CSS properties that can be auto-animated. Position & scale\n\t// is matched separately so there's no need to include styles\n\t// like top/right/bottom/left, width/height or margin.\n\tautoAnimateStyles: [\n\t\t'opacity',\n\t\t'color',\n\t\t'background-color',\n\t\t'padding',\n\t\t'font-size',\n\t\t'line-height',\n\t\t'letter-spacing',\n\t\t'border-width',\n\t\t'border-color',\n\t\t'border-radius',\n\t\t'outline',\n\t\t'outline-offset'\n\t],\n\n\t// Controls automatic progression to the next slide\n\t// - 0: Auto-sliding only happens if the data-autoslide HTML attribute\n\t// is present on the current slide or fragment\n\t// - 1+: All slides will progress automatically at the given interval\n\t// - false: No auto-sliding, even if data-autoslide is present\n\tautoSlide: 0,\n\n\t// Stop auto-sliding after user input\n\tautoSlideStoppable: true,\n\n\t// Use this method for navigation when auto-sliding (defaults to navigateNext)\n\tautoSlideMethod: null,\n\n\t// Specify the average time in seconds that you think you will spend\n\t// presenting each slide. This is used to show a pacing timer in the\n\t// speaker view\n\tdefaultTiming: null,\n\n\t// Enable slide navigation via mouse wheel\n\tmouseWheel: false,\n\n\t// Opens links in an iframe preview overlay\n\t// Add `data-preview-link` and `data-preview-link=\"false\"` to customise each link\n\t// individually\n\tpreviewLinks: false,\n\n\t// Exposes the reveal.js API through window.postMessage\n\tpostMessage: true,\n\n\t// Dispatches all reveal.js events to the parent window through postMessage\n\tpostMessageEvents: false,\n\n\t// Focuses body when page changes visibility to ensure keyboard shortcuts work\n\tfocusBodyOnPageVisibilityChange: true,\n\n\t// Transition style\n\ttransition: 'slide', // none/fade/slide/convex/concave/zoom\n\n\t// Transition speed\n\ttransitionSpeed: 'default', // default/fast/slow\n\n\t// Transition style for full page slide backgrounds\n\tbackgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom\n\n\t// Parallax background image\n\tparallaxBackgroundImage: '', // CSS syntax, e.g. \"a.jpg\"\n\n\t// Parallax background size\n\tparallaxBackgroundSize: '', // CSS syntax, e.g. \"3000px 2000px\"\n\n\t// Parallax background repeat\n\tparallaxBackgroundRepeat: '', // repeat/repeat-x/repeat-y/no-repeat/initial/inherit\n\n\t// Parallax background position\n\tparallaxBackgroundPosition: '', // CSS syntax, e.g. \"top left\"\n\n\t// Amount of pixels to move the parallax background per slide step\n\tparallaxBackgroundHorizontal: null,\n\tparallaxBackgroundVertical: null,\n\n\t// Can be used to initialize reveal.js in one of the following views:\n\t// - print: Render the presentation so that it can be printed to PDF\n\t// - scroll: Show the presentation as a tall scrollable page with scroll\n\t// triggered animations\n\tview: null,\n\n\t// Adjusts the height of each slide in the scroll view.\n\t// - full: Each slide is as tall as the viewport\n\t// - compact: Slides are as small as possible, allowing multiple slides\n\t// to be visible in parallel on tall devices\n\tscrollLayout: 'full',\n\n\t// Control how scroll snapping works in the scroll view.\n\t// - false: \tNo snapping, scrolling is continuous\n\t// - proximity: Snap when close to a slide\n\t// - mandatory: Always snap to the closest slide\n\t//\n\t// Only applies to presentations in scroll view.\n\tscrollSnap: 'mandatory',\n\n\t// Enables and configure the scroll view progress bar.\n\t// - 'auto': Show the scrollbar while scrolling, hide while idle\n\t// - true: Always show the scrollbar\n\t// - false: Never show the scrollbar\n\tscrollProgress: 'auto',\n\n\t// Automatically activate the scroll view when we the viewport falls\n\t// below the given width.\n\tscrollActivationWidth: 435,\n\n\t// The maximum number of pages a single slide can expand onto when printing\n\t// to PDF, unlimited by default\n\tpdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,\n\n\t// Prints each fragment on a separate slide\n\tpdfSeparateFragments: true,\n\n\t// Offset used to reduce the height of content within exported PDF pages.\n\t// This exists to account for environment differences based on how you\n\t// print to PDF. CLI printing options, like phantomjs and wkpdf, can end\n\t// on precisely the total height of the document whereas in-browser\n\t// printing has to end one pixel before.\n\tpdfPageHeightOffset: -1,\n\n\t// Number of slides away from the current that are visible\n\tviewDistance: 3,\n\n\t// Number of slides away from the current that are visible on mobile\n\t// devices. It is advisable to set this to a lower number than\n\t// viewDistance in order to save resources.\n\tmobileViewDistance: 2,\n\n\t// The display mode that will be used to show slides\n\tdisplay: 'block',\n\n\t// Hide cursor if inactive\n\thideInactiveCursor: true,\n\n\t// Time before the cursor is hidden (in ms)\n\thideCursorTime: 5000,\n\n\t// Should we automatically sort and set indices for fragments\n\t// at each sync? (See Reveal.sync)\n\tsortFragmentsOnSync: true,\n\n\t// Script dependencies to load\n\tdependencies: [],\n\n\t// Plugin objects to register and use for this presentation\n\tplugins: []\n\n}","import SlideContent from './controllers/slidecontent.js'\nimport SlideNumber from './controllers/slidenumber.js'\nimport JumpToSlide from './controllers/jumptoslide.js'\nimport Backgrounds from './controllers/backgrounds.js'\nimport AutoAnimate from './controllers/autoanimate.js'\nimport ScrollView from './controllers/scrollview.js'\nimport PrintView from './controllers/printview.js'\nimport Fragments from './controllers/fragments.js'\nimport Overview from './controllers/overview.js'\nimport Keyboard from './controllers/keyboard.js'\nimport Location from './controllers/location.js'\nimport Controls from './controllers/controls.js'\nimport Progress from './controllers/progress.js'\nimport Pointer from './controllers/pointer.js'\nimport Plugins from './controllers/plugins.js'\nimport Overlay from './controllers/overlay.js'\nimport Touch from './controllers/touch.js'\nimport Focus from './controllers/focus.js'\nimport Notes from './controllers/notes.js'\nimport Playback from './components/playback.js'\nimport defaultConfig from './config.js'\nimport * as Util from './utils/util.js'\nimport * as Device from './utils/device.js'\nimport {\n\tSLIDES_SELECTOR,\n\tHORIZONTAL_SLIDES_SELECTOR,\n\tVERTICAL_SLIDES_SELECTOR,\n\tPOST_MESSAGE_METHOD_BLACKLIST\n} from './utils/constants.js'\n\n// The reveal.js version\nexport const VERSION = '5.2.1';\n\n/**\n * reveal.js\n * https://revealjs.com\n * MIT licensed\n *\n * Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se\n */\nexport default function( revealElement, options ) {\n\n\t// Support initialization with no args, one arg\n\t// [options] or two args [revealElement, options]\n\tif( arguments.length < 2 ) {\n\t\toptions = arguments[0];\n\t\trevealElement = document.querySelector( '.reveal' );\n\t}\n\n\tconst Reveal = {};\n\n\t// Configuration defaults, can be overridden at initialization time\n\tlet config = {},\n\n\t\t// Flags if initialize() has been invoked for this reveal instance\n\t\tinitialized = false,\n\n\t\t// Flags if reveal.js is loaded (has dispatched the 'ready' event)\n\t\tready = false,\n\n\t\t// The horizontal and vertical index of the currently active slide\n\t\tindexh,\n\t\tindexv,\n\n\t\t// The previous and current slide HTML elements\n\t\tpreviousSlide,\n\t\tcurrentSlide,\n\n\t\t// Remember which directions that the user has navigated towards\n\t\tnavigationHistory = {\n\t\t\thasNavigatedHorizontally: false,\n\t\t\thasNavigatedVertically: false\n\t\t},\n\n\t\t// Slides may have a data-state attribute which we pick up and apply\n\t\t// as a class to the body. This list contains the combined state of\n\t\t// all current slides.\n\t\tstate = [],\n\n\t\t// The current scale of the presentation (see width/height config)\n\t\tscale = 1,\n\n\t\t// CSS transform that is currently applied to the slides container,\n\t\t// split into two groups\n\t\tslidesTransform = { layout: '', overview: '' },\n\n\t\t// Cached references to DOM elements\n\t\tdom = {},\n\n\t\t// Flags if the interaction event listeners are bound\n\t\teventsAreBound = false,\n\n\t\t// The current slide transition state; idle or running\n\t\ttransition = 'idle',\n\n\t\t// The current auto-slide duration\n\t\tautoSlide = 0,\n\n\t\t// Auto slide properties\n\t\tautoSlidePlayer,\n\t\tautoSlideTimeout = 0,\n\t\tautoSlideStartTime = -1,\n\t\tautoSlidePaused = false,\n\n\t\t// Controllers for different aspects of our presentation. They're\n\t\t// all given direct references to this Reveal instance since there\n\t\t// may be multiple presentations running in parallel.\n\t\tslideContent = new SlideContent( Reveal ),\n\t\tslideNumber = new SlideNumber( Reveal ),\n\t\tjumpToSlide = new JumpToSlide( Reveal ),\n\t\tautoAnimate = new AutoAnimate( Reveal ),\n\t\tbackgrounds = new Backgrounds( Reveal ),\n\t\tscrollView = new ScrollView( Reveal ),\n\t\tprintView = new PrintView( Reveal ),\n\t\tfragments = new Fragments( Reveal ),\n\t\toverview = new Overview( Reveal ),\n\t\tkeyboard = new Keyboard( Reveal ),\n\t\tlocation = new Location( Reveal ),\n\t\tcontrols = new Controls( Reveal ),\n\t\tprogress = new Progress( Reveal ),\n\t\tpointer = new Pointer( Reveal ),\n\t\tplugins = new Plugins( Reveal ),\n\t\toverlay = new Overlay( Reveal ),\n\t\tfocus = new Focus( Reveal ),\n\t\ttouch = new Touch( Reveal ),\n\t\tnotes = new Notes( Reveal );\n\n\t/**\n\t * Starts up the presentation.\n\t */\n\tfunction initialize( initOptions ) {\n\n\t\tif( !revealElement ) throw 'Unable to find presentation root ().';\n\n\t\tif( initialized ) throw 'Reveal.js has already been initialized.';\n\n\t\tinitialized = true;\n\n\t\t// Cache references to key DOM elements\n\t\tdom.wrapper = revealElement;\n\t\tdom.slides = revealElement.querySelector( '.slides' );\n\n\t\tif( !dom.slides ) throw 'Unable to find slides container (
).';\n\n\t\t// Compose our config object in order of increasing precedence:\n\t\t// 1. Default reveal.js options\n\t\t// 2. Options provided via Reveal.configure() prior to\n\t\t// initialization\n\t\t// 3. Options passed to the Reveal constructor\n\t\t// 4. Options passed to Reveal.initialize\n\t\t// 5. Query params\n\t\tconfig = { ...defaultConfig, ...config, ...options, ...initOptions, ...Util.getQueryHash() };\n\n\t\t// Legacy support for the ?print-pdf query\n\t\tif( /print-pdf/gi.test( window.location.search ) ) {\n\t\t\tconfig.view = 'print';\n\t\t}\n\n\t\tsetViewport();\n\n\t\t// Force a layout when the whole page, incl fonts, has loaded\n\t\twindow.addEventListener( 'load', layout, false );\n\n\t\t// Register plugins and load dependencies, then move on to #start()\n\t\tplugins.load( config.plugins, config.dependencies ).then( start );\n\n\t\treturn new Promise( resolve => Reveal.on( 'ready', resolve ) );\n\n\t}\n\n\t/**\n\t * Encase the presentation in a reveal.js viewport. The\n\t * extent of the viewport differs based on configuration.\n\t */\n\tfunction setViewport() {\n\n\t\t// Embedded decks use the reveal element as their viewport\n\t\tif( config.embedded === true ) {\n\t\t\tdom.viewport = Util.closest( revealElement, '.reveal-viewport' ) || revealElement;\n\t\t}\n\t\t// Full-page decks use the body as their viewport\n\t\telse {\n\t\t\tdom.viewport = document.body;\n\t\t\tdocument.documentElement.classList.add( 'reveal-full-page' );\n\t\t}\n\n\t\tdom.viewport.classList.add( 'reveal-viewport' );\n\n\t}\n\n\t/**\n\t * Starts up reveal.js by binding input events and navigating\n\t * to the current URL deeplink if there is one.\n\t */\n\tfunction start() {\n\n\t\t// Don't proceed if this instance has been destroyed\n\t\tif( initialized === false ) return;\n\n\t\tready = true;\n\n\t\t// Remove slides hidden with data-visibility\n\t\tremoveHiddenSlides();\n\n\t\t// Make sure we've got all the DOM elements we need\n\t\tsetupDOM();\n\n\t\t// Listen to messages posted to this window\n\t\tsetupPostMessage();\n\n\t\t// Prevent the slides from being scrolled out of view\n\t\tsetupScrollPrevention();\n\n\t\t// Adds bindings for fullscreen mode\n\t\tsetupFullscreen();\n\n\t\t// Resets all vertical slides so that only the first is visible\n\t\tresetVerticalSlides();\n\n\t\t// Updates the presentation to match the current configuration values\n\t\tconfigure();\n\n\t\t// Create slide backgrounds\n\t\tbackgrounds.update( true );\n\n\t\t// Activate the print/scroll view if configured\n\t\tactivateInitialView();\n\n\t\t// Read the initial hash\n\t\tlocation.readURL();\n\n\t\t// Notify listeners that the presentation is ready but use a 1ms\n\t\t// timeout to ensure it's not fired synchronously after #initialize()\n\t\tsetTimeout( () => {\n\t\t\t// Enable transitions now that we're loaded\n\t\t\tdom.slides.classList.remove( 'no-transition' );\n\n\t\t\tdom.wrapper.classList.add( 'ready' );\n\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'ready',\n\t\t\t\tdata: {\n\t\t\t\t\tindexh,\n\t\t\t\t\tindexv,\n\t\t\t\t\tcurrentSlide\n\t\t\t\t}\n\t\t\t});\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Activates the correct reveal.js view based on our config.\n\t * This is only invoked once during initialization.\n\t */\n\tfunction activateInitialView() {\n\n\t\tconst activatePrintView = config.view === 'print';\n\t\tconst activateScrollView = config.view === 'scroll' || config.view === 'reader';\n\n\t\tif( activatePrintView || activateScrollView ) {\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\tremoveEventListeners();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttouch.unbind();\n\t\t\t}\n\n\t\t\t// Avoid content flickering during layout\n\t\t\tdom.viewport.classList.add( 'loading-scroll-mode' );\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\t// The document needs to have loaded for the PDF layout\n\t\t\t\t// measurements to be accurate\n\t\t\t\tif( document.readyState === 'complete' ) {\n\t\t\t\t\tprintView.activate();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twindow.addEventListener( 'load', () => printView.activate() );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscrollView.activate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes all slides with data-visibility=\"hidden\". This\n\t * is done right before the rest of the presentation is\n\t * initialized.\n\t *\n\t * If you want to show all hidden slides, initialize\n\t * reveal.js with showHiddenSlides set to true.\n\t */\n\tfunction removeHiddenSlides() {\n\n\t\tif( !config.showHiddenSlides ) {\n\t\t\tUtil.queryAll( dom.wrapper, 'section[data-visibility=\"hidden\"]' ).forEach( slide => {\n\t\t\t\tconst parent = slide.parentNode;\n\n\t\t\t\t// If this slide is part of a stack and that stack will be\n\t\t\t\t// empty after removing the hidden slide, remove the entire\n\t\t\t\t// stack\n\t\t\t\tif( parent.childElementCount === 1 && /section/i.test( parent.nodeName ) ) {\n\t\t\t\t\tparent.remove();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslide.remove();\n\t\t\t\t}\n\n\t\t\t} );\n\t\t}\n\n\t}\n\n\t/**\n\t * Finds and stores references to DOM elements which are\n\t * required by the presentation. If a required element is\n\t * not found, it is created.\n\t */\n\tfunction setupDOM() {\n\n\t\t// Prevent transitions while we're loading\n\t\tdom.slides.classList.add( 'no-transition' );\n\n\t\tif( Device.isMobile ) {\n\t\t\tdom.wrapper.classList.add( 'no-hover' );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.classList.remove( 'no-hover' );\n\t\t}\n\n\t\tbackgrounds.render();\n\t\tslideNumber.render();\n\t\tjumpToSlide.render();\n\t\tcontrols.render();\n\t\tprogress.render();\n\t\tnotes.render();\n\n\t\t// Overlay graphic which is displayed during the paused mode\n\t\tdom.pauseOverlay = Util.createSingletonNode( dom.wrapper, 'div', 'pause-overlay', config.controls ? 'Resume presentation ' : null );\n\n\t\tdom.statusElement = createStatusElement();\n\n\t\tdom.wrapper.setAttribute( 'role', 'application' );\n\t}\n\n\t/**\n\t * Creates a hidden div with role aria-live to announce the\n\t * current slide content. Hide the div off-screen to make it\n\t * available only to Assistive Technologies.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction createStatusElement() {\n\n\t\tlet statusElement = dom.wrapper.querySelector( '.aria-status' );\n\t\tif( !statusElement ) {\n\t\t\tstatusElement = document.createElement( 'div' );\n\t\t\tstatusElement.style.position = 'absolute';\n\t\t\tstatusElement.style.height = '1px';\n\t\t\tstatusElement.style.width = '1px';\n\t\t\tstatusElement.style.overflow = 'hidden';\n\t\t\tstatusElement.style.clip = 'rect( 1px, 1px, 1px, 1px )';\n\t\t\tstatusElement.classList.add( 'aria-status' );\n\t\t\tstatusElement.setAttribute( 'aria-live', 'polite' );\n\t\t\tstatusElement.setAttribute( 'aria-atomic','true' );\n\t\t\tdom.wrapper.appendChild( statusElement );\n\t\t}\n\t\treturn statusElement;\n\n\t}\n\n\t/**\n\t * Announces the given text to screen readers.\n\t */\n\tfunction announceStatus( value ) {\n\n\t\tdom.statusElement.textContent = value;\n\n\t}\n\n\t/**\n\t * Converts the given HTML element into a string of text\n\t * that can be announced to a screen reader. Hidden\n\t * elements are excluded.\n\t */\n\tfunction getStatusText( node ) {\n\n\t\tlet text = '';\n\n\t\t// Text node\n\t\tif( node.nodeType === 3 ) {\n\t\t\ttext += node.textContent.trim();\n\t\t}\n\t\t// Element node\n\t\telse if( node.nodeType === 1 ) {\n\n\t\t\tlet isAriaHidden = node.getAttribute( 'aria-hidden' );\n\t\t\tlet isDisplayHidden = window.getComputedStyle( node )['display'] === 'none';\n\t\t\tif( isAriaHidden !== 'true' && !isDisplayHidden ) {\n\n\t\t\t\t// Capture alt text from img and video elements\n\t\t\t\tif( node.tagName === 'IMG' || node.tagName === 'VIDEO' ) {\n\t\t\t\t\tlet altText = node.getAttribute( 'alt' );\n\t\t\t\t\tif( altText ) {\n\t\t\t\t\t\ttext += ensurePunctuation( altText );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( node.childNodes ).forEach( child => {\n\t\t\t\t\ttext += getStatusText( child );\n\t\t\t\t} );\n\n\t\t\t\t// Add period after block-level text elements to improve\n\t\t\t\t// screen reader experience\n\t\t\t\tconst textElements = ['P', 'DIV', 'UL', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'BLOCKQUOTE'];\n\t\t\t\tif( textElements.includes( node.tagName ) && text.trim() !== '' ) {\n\t\t\t\t\ttext = ensurePunctuation( text );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttext = text.trim();\n\n\t\treturn text === '' ? '' : text + ' ';\n\n\t}\n\n\t/**\n\t * Ensures text ends with proper punctuation by adding a period\n\t * if it doesn't already end with punctuation.\n\t */\n\tfunction ensurePunctuation( text ) {\n\n\t\tconst trimmedText = text.trim();\n\n\t\tif( trimmedText === '' ) {\n\t\t\treturn text;\n\t\t}\n\n\t\treturn !/[.!?]$/.test(trimmedText) ? trimmedText + '.' : trimmedText;\n\n\t}\n\n\t/**\n\t * This is an unfortunate necessity. Some actions – such as\n\t * an input field being focused in an iframe or using the\n\t * keyboard to expand text selection beyond the bounds of\n\t * a slide – can trigger our content to be pushed out of view.\n\t * This scrolling can not be prevented by hiding overflow in\n\t * CSS (we already do) so we have to resort to repeatedly\n\t * checking if the slides have been offset :(\n\t */\n\tfunction setupScrollPrevention() {\n\n\t\tsetInterval( () => {\n\t\t\tif( !scrollView.isActive() && dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) {\n\t\t\t\tdom.wrapper.scrollTop = 0;\n\t\t\t\tdom.wrapper.scrollLeft = 0;\n\t\t\t}\n\t\t}, 1000 );\n\n\t}\n\n\t/**\n\t * After entering fullscreen we need to force a layout to\n\t * get our presentations to scale correctly. This behavior\n\t * is inconsistent across browsers but a force layout seems\n\t * to normalize it.\n\t */\n\tfunction setupFullscreen() {\n\n\t\tdocument.addEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.addEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\n\t}\n\n\t/**\n\t * Registers a listener to postMessage events, this makes it\n\t * possible to call all reveal.js API methods from another\n\t * window. For example:\n\t *\n\t * revealWindow.postMessage( JSON.stringify({\n\t * method: 'slide',\n\t * args: [ 2 ]\n\t * }), '*' );\n\t */\n\tfunction setupPostMessage() {\n\n\t\tif( config.postMessage ) {\n\t\t\twindow.addEventListener( 'message', onPostMessage, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the configuration settings from the config\n\t * object. May be called multiple times.\n\t *\n\t * @param {object} options\n\t */\n\tfunction configure( options ) {\n\n\t\tconst oldConfig = { ...config }\n\n\t\t// New config options may be passed when this method\n\t\t// is invoked through the API after initialization\n\t\tif( typeof options === 'object' ) Util.extend( config, options );\n\n\t\t// Abort if reveal.js hasn't finished loading, config\n\t\t// changes will be applied automatically once ready\n\t\tif( Reveal.isReady() === false ) return;\n\n\t\tconst numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length;\n\n\t\t// The transition is added as a class on the .reveal element\n\t\tdom.wrapper.classList.remove( oldConfig.transition );\n\t\tdom.wrapper.classList.add( config.transition );\n\n\t\tdom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );\n\t\tdom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );\n\n\t\t// Expose our configured slide dimensions as custom props\n\t\tdom.viewport.style.setProperty( '--slide-width', typeof config.width === 'string' ? config.width : config.width + 'px' );\n\t\tdom.viewport.style.setProperty( '--slide-height', typeof config.height === 'string' ? config.height : config.height + 'px' );\n\n\t\tif( config.shuffle ) {\n\t\t\tshuffle();\n\t\t}\n\n\t\tUtil.toggleClass( dom.wrapper, 'embedded', config.embedded );\n\t\tUtil.toggleClass( dom.wrapper, 'rtl', config.rtl );\n\t\tUtil.toggleClass( dom.wrapper, 'center', config.center );\n\n\t\t// Exit the paused mode if it was configured off\n\t\tif( config.pause === false ) {\n\t\t\tresume();\n\t\t}\n\n\t\t// Reset all changes made by auto-animations\n\t\tautoAnimate.reset();\n\n\t\t// Remove existing auto-slide controls\n\t\tif( autoSlidePlayer ) {\n\t\t\tautoSlidePlayer.destroy();\n\t\t\tautoSlidePlayer = null;\n\t\t}\n\n\t\t// Generate auto-slide controls if needed\n\t\tif( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable ) {\n\t\t\tautoSlidePlayer = new Playback( dom.wrapper, () => {\n\t\t\t\treturn Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );\n\t\t\t} );\n\n\t\t\tautoSlidePlayer.on( 'click', onAutoSlidePlayerClick );\n\t\t\tautoSlidePaused = false;\n\t\t}\n\n\t\t// Add the navigation mode to the DOM so we can adjust styling\n\t\tif( config.navigationMode !== 'default' ) {\n\t\t\tdom.wrapper.setAttribute( 'data-navigation-mode', config.navigationMode );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.removeAttribute( 'data-navigation-mode' );\n\t\t}\n\n\t\tnotes.configure( config, oldConfig );\n\t\tfocus.configure( config, oldConfig );\n\t\tpointer.configure( config, oldConfig );\n\t\tcontrols.configure( config, oldConfig );\n\t\tprogress.configure( config, oldConfig );\n\t\tkeyboard.configure( config, oldConfig );\n\t\tfragments.configure( config, oldConfig );\n\t\tslideNumber.configure( config, oldConfig );\n\n\t\tsync();\n\n\t}\n\n\t/**\n\t * Binds all event listeners.\n\t */\n\tfunction addEventListeners() {\n\n\t\teventsAreBound = true;\n\n\t\twindow.addEventListener( 'resize', onWindowResize, false );\n\n\t\tif( config.touch ) touch.bind();\n\t\tif( config.keyboard ) keyboard.bind();\n\t\tif( config.progress ) progress.bind();\n\t\tif( config.respondToHashChanges ) location.bind();\n\t\tcontrols.bind();\n\t\tfocus.bind();\n\n\t\tdom.slides.addEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.addEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.addEventListener( 'click', resume, false );\n\n\t\tif( config.focusBodyOnPageVisibilityChange ) {\n\t\t\tdocument.addEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Unbinds all event listeners.\n\t */\n\tfunction removeEventListeners() {\n\n\t\teventsAreBound = false;\n\n\t\ttouch.unbind();\n\t\tfocus.unbind();\n\t\tkeyboard.unbind();\n\t\tcontrols.unbind();\n\t\tprogress.unbind();\n\t\tlocation.unbind();\n\n\t\twindow.removeEventListener( 'resize', onWindowResize, false );\n\n\t\tdom.slides.removeEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.removeEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.removeEventListener( 'click', resume, false );\n\n\t}\n\n\t/**\n\t * Uninitializes reveal.js by undoing changes made to the\n\t * DOM and removing all event listeners.\n\t */\n\tfunction destroy() {\n\n\t\tinitialized = false;\n\n\t\t// There's nothing to destroy if this instance hasn't finished\n\t\t// initializing\n\t\tif( ready === false ) return;\n\n\t\tremoveEventListeners();\n\t\tcancelAutoSlide();\n\n\t\t// Destroy controllers\n\t\tnotes.destroy();\n\t\tfocus.destroy();\n\t\toverlay.destroy();\n\t\tplugins.destroy();\n\t\tpointer.destroy();\n\t\tcontrols.destroy();\n\t\tprogress.destroy();\n\t\tbackgrounds.destroy();\n\t\tslideNumber.destroy();\n\t\tjumpToSlide.destroy();\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\twindow.removeEventListener( 'message', onPostMessage, false );\n\t\twindow.removeEventListener( 'load', layout, false );\n\n\t\t// Undo DOM changes\n\t\tif( dom.pauseOverlay ) dom.pauseOverlay.remove();\n\t\tif( dom.statusElement ) dom.statusElement.remove();\n\n\t\tdocument.documentElement.classList.remove( 'reveal-full-page' );\n\n\t\tdom.wrapper.classList.remove( 'ready', 'center', 'has-horizontal-slides', 'has-vertical-slides' );\n\t\tdom.wrapper.removeAttribute( 'data-transition-speed' );\n\t\tdom.wrapper.removeAttribute( 'data-background-transition' );\n\n\t\tdom.viewport.classList.remove( 'reveal-viewport' );\n\t\tdom.viewport.style.removeProperty( '--slide-width' );\n\t\tdom.viewport.style.removeProperty( '--slide-height' );\n\n\t\tdom.slides.style.removeProperty( 'width' );\n\t\tdom.slides.style.removeProperty( 'height' );\n\t\tdom.slides.style.removeProperty( 'zoom' );\n\t\tdom.slides.style.removeProperty( 'left' );\n\t\tdom.slides.style.removeProperty( 'top' );\n\t\tdom.slides.style.removeProperty( 'bottom' );\n\t\tdom.slides.style.removeProperty( 'right' );\n\t\tdom.slides.style.removeProperty( 'transform' );\n\n\t\tArray.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => {\n\t\t\tslide.style.removeProperty( 'display' );\n\t\t\tslide.style.removeProperty( 'top' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Adds a listener to one of our custom reveal.js events,\n\t * like slidechanged.\n\t */\n\tfunction on( type, listener, useCapture ) {\n\n\t\trevealElement.addEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Unsubscribes from a reveal.js event.\n\t */\n\tfunction off( type, listener, useCapture ) {\n\n\t\trevealElement.removeEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Applies CSS transforms to the slides container. The container\n\t * is transformed from two separate sources: layout and the overview\n\t * mode.\n\t *\n\t * @param {object} transforms\n\t */\n\tfunction transformSlides( transforms ) {\n\n\t\t// Pick up new transforms from arguments\n\t\tif( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout;\n\t\tif( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview;\n\n\t\t// Apply the transforms to the slides container\n\t\tif( slidesTransform.layout ) {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview );\n\t\t}\n\t\telse {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.overview );\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event of the specified type from the\n\t * reveal DOM element.\n\t */\n\tfunction dispatchEvent({ target=dom.wrapper, type, data, bubbles=true }) {\n\n\t\tlet event = document.createEvent( 'HTMLEvents', 1, 2 );\n\t\tevent.initEvent( type, bubbles, true );\n\t\tUtil.extend( event, data );\n\t\ttarget.dispatchEvent( event );\n\n\t\tif( target === dom.wrapper ) {\n\t\t\t// If we're in an iframe, post each reveal.js event to the\n\t\t\t// parent window. Used by the notes plugin\n\t\t\tdispatchPostMessage( type );\n\t\t}\n\n\t\treturn event;\n\n\t}\n\n\t/**\n\t * Dispatches a slidechanged event.\n\t *\n\t * @param {string} origin Used to identify multiplex clients\n\t */\n\tfunction dispatchSlideChanged( origin ) {\n\n\t\tdispatchEvent({\n\t\t\ttype: 'slidechanged',\n\t\t\tdata: {\n\t\t\t\tindexh,\n\t\t\t\tindexv,\n\t\t\t\tpreviousSlide,\n\t\t\t\tcurrentSlide,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Dispatched a postMessage of the given type from our window.\n\t */\n\tfunction dispatchPostMessage( type, data ) {\n\n\t\tif( config.postMessageEvents && window.parent !== window.self ) {\n\t\t\tlet message = {\n\t\t\t\tnamespace: 'reveal',\n\t\t\t\teventName: type,\n\t\t\t\tstate: getState()\n\t\t\t};\n\n\t\t\tUtil.extend( message, data );\n\n\t\t\twindow.parent.postMessage( JSON.stringify( message ), '*' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies JavaScript-controlled layout rules to the\n\t * presentation.\n\t */\n\tfunction layout() {\n\n\t\tif( dom.wrapper && !printView.isActive() ) {\n\n\t\t\tconst viewportWidth = dom.viewport.offsetWidth;\n\t\t\tconst viewportHeight = dom.viewport.offsetHeight;\n\n\t\t\tif( !config.disableLayout ) {\n\n\t\t\t\t// On some mobile devices '100vh' is taller than the visible\n\t\t\t\t// viewport which leads to part of the presentation being\n\t\t\t\t// cut off. To work around this we define our own '--vh' custom\n\t\t\t\t// property where 100x adds up to the correct height.\n\t\t\t\t//\n\t\t\t\t// https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n\t\t\t\tif( Device.isMobile && !config.embedded ) {\n\t\t\t\t\tdocument.documentElement.style.setProperty( '--vh', ( window.innerHeight * 0.01 ) + 'px' );\n\t\t\t\t}\n\n\t\t\t\tconst size = scrollView.isActive() ?\n\t\t\t\t\t\t\t getComputedSlideSize( viewportWidth, viewportHeight ) :\n\t\t\t\t\t\t\t getComputedSlideSize();\n\n\t\t\t\tconst oldScale = scale;\n\n\t\t\t\t// Layout the contents of the slides\n\t\t\t\tlayoutSlideContents( config.width, config.height );\n\n\t\t\t\tdom.slides.style.width = size.width + 'px';\n\t\t\t\tdom.slides.style.height = size.height + 'px';\n\n\t\t\t\t// Determine scale of content to fit within available space\n\t\t\t\tscale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height );\n\n\t\t\t\t// Respect max/min scale settings\n\t\t\t\tscale = Math.max( scale, config.minScale );\n\t\t\t\tscale = Math.min( scale, config.maxScale );\n\n\t\t\t\t// Don't apply any scaling styles if scale is 1 or we're\n\t\t\t\t// in the scroll view\n\t\t\t\tif( scale === 1 || scrollView.isActive() ) {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '';\n\t\t\t\t\tdom.slides.style.top = '';\n\t\t\t\t\tdom.slides.style.bottom = '';\n\t\t\t\t\tdom.slides.style.right = '';\n\t\t\t\t\ttransformSlides( { layout: '' } );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '50%';\n\t\t\t\t\tdom.slides.style.top = '50%';\n\t\t\t\t\tdom.slides.style.bottom = 'auto';\n\t\t\t\t\tdom.slides.style.right = 'auto';\n\t\t\t\t\ttransformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } );\n\t\t\t\t}\n\n\t\t\t\t// Select all slides, vertical and horizontal\n\t\t\t\tconst slides = Array.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) );\n\n\t\t\t\tfor( let i = 0, len = slides.length; i < len; i++ ) {\n\t\t\t\t\tconst slide = slides[ i ];\n\n\t\t\t\t\t// Don't bother updating invisible slides\n\t\t\t\t\tif( slide.style.display === 'none' ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( ( config.center || slide.classList.contains( 'center' ) ) ) {\n\t\t\t\t\t\t// Vertical stacks are not centred since their section\n\t\t\t\t\t\t// children will be\n\t\t\t\t\t\tif( slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\t\t\tslide.style.top = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslide.style.top = Math.max( ( size.height - slide.scrollHeight ) / 2, 0 ) + 'px';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tslide.style.top = '';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif( oldScale !== scale ) {\n\t\t\t\t\tdispatchEvent({\n\t\t\t\t\t\ttype: 'resize',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\toldScale,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\tsize\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcheckResponsiveScrollView();\n\n\t\t\tdom.viewport.style.setProperty( '--slide-scale', scale );\n\t\t\tdom.viewport.style.setProperty( '--viewport-width', viewportWidth + 'px' );\n\t\t\tdom.viewport.style.setProperty( '--viewport-height', viewportHeight + 'px' );\n\n\t\t\tscrollView.layout();\n\n\t\t\tprogress.update();\n\t\t\tbackgrounds.updateParallax();\n\n\t\t\tif( overview.isActive() ) {\n\t\t\t\toverview.update();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies layout logic to the contents of all slides in\n\t * the presentation.\n\t *\n\t * @param {string|number} width\n\t * @param {string|number} height\n\t */\n\tfunction layoutSlideContents( width, height ) {\n\t\t// Handle sizing of elements with the 'r-stretch' class\n\t\tUtil.queryAll( dom.slides, 'section > .stretch, section > .r-stretch' ).forEach( element => {\n\n\t\t\t// Determine how much vertical space we can use\n\t\t\tlet remainingHeight = Util.getRemainingHeight( element, height );\n\n\t\t\t// Consider the aspect ratio of media elements\n\t\t\tif( /(img|video)/gi.test( element.nodeName ) ) {\n\t\t\t\tconst nw = element.naturalWidth || element.videoWidth,\n\t\t\t\t\t nh = element.naturalHeight || element.videoHeight;\n\n\t\t\t\tconst es = Math.min( width / nw, remainingHeight / nh );\n\n\t\t\t\telement.style.width = ( nw * es ) + 'px';\n\t\t\t\telement.style.height = ( nh * es ) + 'px';\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.width = width + 'px';\n\t\t\t\telement.style.height = remainingHeight + 'px';\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Responsively activates the scroll mode when we reach the configured\n\t * activation width.\n\t */\n\tfunction checkResponsiveScrollView() {\n\n\t\t// Only proceed if...\n\t\t// 1. The DOM is ready\n\t\t// 2. Layouts aren't disabled via config\n\t\t// 3. We're not currently printing\n\t\t// 4. There is a scrollActivationWidth set\n\t\t// 5. The deck isn't configured to always use the scroll view\n\t\tif(\n\t\t\tdom.wrapper &&\n\t\t\t!config.disableLayout &&\n\t\t\t!printView.isActive() &&\n\t\t\ttypeof config.scrollActivationWidth === 'number' &&\n\t\t\tconfig.view !== 'scroll'\n\t\t) {\n\t\t\tconst size = getComputedSlideSize();\n\n\t\t\tif( size.presentationWidth > 0 && size.presentationWidth <= config.scrollActivationWidth ) {\n\t\t\t\tif( !scrollView.isActive() ) {\n\t\t\t\t\tbackgrounds.create();\n\t\t\t\t\tscrollView.activate()\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( scrollView.isActive() ) scrollView.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates the computed pixel size of our slides. These\n\t * values are based on the width and height configuration\n\t * options.\n\t *\n\t * @param {number} [presentationWidth=dom.wrapper.offsetWidth]\n\t * @param {number} [presentationHeight=dom.wrapper.offsetHeight]\n\t */\n\tfunction getComputedSlideSize( presentationWidth, presentationHeight ) {\n\n\t\tlet width = config.width;\n\t\tlet height = config.height;\n\n\t\tif( config.disableLayout ) {\n\t\t\twidth = dom.slides.offsetWidth;\n\t\t\theight = dom.slides.offsetHeight;\n\t\t}\n\n\t\tconst size = {\n\t\t\t// Slide size\n\t\t\twidth: width,\n\t\t\theight: height,\n\n\t\t\t// Presentation size\n\t\t\tpresentationWidth: presentationWidth || dom.wrapper.offsetWidth,\n\t\t\tpresentationHeight: presentationHeight || dom.wrapper.offsetHeight\n\t\t};\n\n\t\t// Reduce available space by margin\n\t\tsize.presentationWidth -= ( size.presentationWidth * config.margin );\n\t\tsize.presentationHeight -= ( size.presentationHeight * config.margin );\n\n\t\t// Slide width may be a percentage of available width\n\t\tif( typeof size.width === 'string' && /%$/.test( size.width ) ) {\n\t\t\tsize.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth;\n\t\t}\n\n\t\t// Slide height may be a percentage of available height\n\t\tif( typeof size.height === 'string' && /%$/.test( size.height ) ) {\n\t\t\tsize.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight;\n\t\t}\n\n\t\treturn size;\n\n\t}\n\n\t/**\n\t * Stores the vertical index of a stack so that the same\n\t * vertical slide can be selected when navigating to and\n\t * from the stack.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t * @param {string|number} [v=0] Index to memorize\n\t */\n\tfunction setPreviousVerticalIndex( stack, v ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {\n\t\t\tstack.setAttribute( 'data-previous-indexv', v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieves the vertical index which was stored using\n\t * #setPreviousVerticalIndex() or 0 if no previous index\n\t * exists.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t */\n\tfunction getPreviousVerticalIndex( stack ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {\n\t\t\t// Prefer manually defined start-indexv\n\t\t\tconst attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';\n\n\t\t\treturn parseInt( stack.getAttribute( attributeName ) || 0, 10 );\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is vertical\n\t * (nested within another slide).\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to check\n\t * orientation of\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalSlide( slide = currentSlide ) {\n\n\t\treturn slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is a stack containing\n\t * vertical slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide]\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalStack( slide = currentSlide ) {\n\n\t\treturn slide.classList.contains( '.stack' ) || slide.querySelector( 'section' ) !== null;\n\n\t}\n\n\t/**\n\t * Returns true if we're on the last slide in the current\n\t * vertical stack.\n\t */\n\tfunction isLastVerticalSlide() {\n\n\t\tif( currentSlide && isVerticalSlide( currentSlide ) ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the first slide in\n\t * the presentation.\n\t */\n\tfunction isFirstSlide() {\n\n\t\treturn indexh === 0 && indexv === 0;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the last slide in\n\t * the presentation. If the last slide is a stack, we only\n\t * consider this the last slide if it's at the end of the\n\t * stack.\n\t */\n\tfunction isLastSlide() {\n\n\t\tif( currentSlide ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\t// If it's vertical, does its parent have a next sibling?\n\t\t\tif( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Enters the paused mode which fades everything on screen to\n\t * black.\n\t */\n\tfunction pause() {\n\n\t\tif( config.pause ) {\n\t\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\n\t\t\tcancelAutoSlide();\n\t\t\tdom.wrapper.classList.add( 'paused' );\n\n\t\t\tif( wasPaused === false ) {\n\t\t\t\tdispatchEvent({ type: 'paused' });\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Exits from the paused mode.\n\t */\n\tfunction resume() {\n\n\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\t\tdom.wrapper.classList.remove( 'paused' );\n\n\t\tcueAutoSlide();\n\n\t\tif( wasPaused ) {\n\t\t\tdispatchEvent({ type: 'resumed' });\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the paused mode on and off.\n\t */\n\tfunction togglePause( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? pause() : resume();\n\t\t}\n\t\telse {\n\t\t\tisPaused() ? resume() : pause();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if we are currently in the paused mode.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isPaused() {\n\n\t\treturn dom.wrapper.classList.contains( 'paused' );\n\n\t}\n\n\t/**\n\t * Toggles visibility of the jump-to-slide UI.\n\t */\n\tfunction toggleJumpToSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? jumpToSlide.show() : jumpToSlide.hide();\n\t\t}\n\t\telse {\n\t\t\tjumpToSlide.isVisible() ? jumpToSlide.hide() : jumpToSlide.show();\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the auto slide mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which sets the desired state.\n\t * True means autoplay starts, false means it stops.\n\t */\n\n\tfunction toggleAutoSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t\telse {\n\t\t\tautoSlidePaused ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the auto slide mode is currently on.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isAutoSliding() {\n\n\t\treturn !!( autoSlide && !autoSlidePaused );\n\n\t}\n\n\t/**\n\t * Steps from the current point in the presentation to the\n\t * slide which matches the specified horizontal and vertical\n\t * indices.\n\t *\n\t * @param {number} [h=indexh] Horizontal index of the target slide\n\t * @param {number} [v=indexv] Vertical index of the target slide\n\t * @param {number} [f] Index of a fragment within the\n\t * target slide to activate\n\t * @param {number} [origin] Origin for use in multimaster environments\n\t */\n\tfunction slide( h, v, f, origin ) {\n\n\t\t// Dispatch an event before the slide\n\t\tconst slidechange = dispatchEvent({\n\t\t\ttype: 'beforeslidechange',\n\t\t\tdata: {\n\t\t\t\tindexh: h === undefined ? indexh : h,\n\t\t\t\tindexv: v === undefined ? indexv : v,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t\t// Abort if this slide change was prevented by an event listener\n\t\tif( slidechange.defaultPrevented ) return;\n\n\t\t// Remember where we were at before\n\t\tpreviousSlide = currentSlide;\n\n\t\t// Query all horizontal slides in the deck\n\t\tconst horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );\n\n\t\t// If we're in scroll mode, we scroll the target slide into view\n\t\t// instead of running our standard slide transition\n\t\tif( scrollView.isActive() ) {\n\t\t\tconst scrollToSlide = scrollView.getSlideByIndices( h, v );\n\t\t\tif( scrollToSlide ) scrollView.scrollToSlide( scrollToSlide );\n\t\t\treturn;\n\t\t}\n\n\t\t// Abort if there are no slides\n\t\tif( horizontalSlides.length === 0 ) return;\n\n\t\t// If no vertical index is specified and the upcoming slide is a\n\t\t// stack, resume at its previous vertical index\n\t\tif( v === undefined && !overview.isActive() ) {\n\t\t\tv = getPreviousVerticalIndex( horizontalSlides[ h ] );\n\t\t}\n\n\t\t// If we were on a vertical stack, remember what vertical index\n\t\t// it was on so we can resume at the same position when returning\n\t\tif( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {\n\t\t\tsetPreviousVerticalIndex( previousSlide.parentNode, indexv );\n\t\t}\n\n\t\t// Remember the state before this slide\n\t\tconst stateBefore = state.concat();\n\n\t\t// Reset the state array\n\t\tstate.length = 0;\n\n\t\tlet indexhBefore = indexh || 0,\n\t\t\tindexvBefore = indexv || 0;\n\n\t\t// Activate and transition to the new slide\n\t\tindexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );\n\t\tindexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );\n\n\t\t// Dispatch an event if the slide changed\n\t\tlet slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );\n\n\t\t// Ensure that the previous slide is never the same as the current\n\t\tif( !slideChanged ) previousSlide = null;\n\n\t\t// Find the current horizontal slide and any possible vertical slides\n\t\t// within it\n\t\tlet currentHorizontalSlide = horizontalSlides[ indexh ],\n\t\t\tcurrentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );\n\n\t\t// Indicate when we're on a vertical slide\n\t\trevealElement.classList.toggle( 'is-vertical-slide', currentVerticalSlides.length > 1 );\n\n\t\t// Store references to the previous and current slides\n\t\tcurrentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;\n\n\t\tlet autoAnimateTransition = false;\n\n\t\t// Detect if we're moving between two auto-animated slides\n\t\tif( slideChanged && previousSlide && currentSlide && !overview.isActive() ) {\n\t\t\ttransition = 'running';\n\n\t\t\tautoAnimateTransition = shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexvBefore );\n\n\t\t\t// If this is an auto-animated transition, we disable the\n\t\t\t// regular slide transition\n\t\t\t//\n\t\t\t// Note 20-03-2020:\n\t\t\t// This needs to happen before we update slide visibility,\n\t\t\t// otherwise transitions will still run in Safari.\n\t\t\tif( autoAnimateTransition ) {\n\t\t\t\tdom.slides.classList.add( 'disable-slide-transitions' )\n\t\t\t}\n\t\t}\n\n\t\t// Update the visibility of slides now that the indices have changed\n\t\tupdateSlidesVisibility();\n\n\t\tlayout();\n\n\t\t// Update the overview if it's currently active\n\t\tif( overview.isActive() ) {\n\t\t\toverview.update();\n\t\t}\n\n\t\t// Show fragment, if specified\n\t\tif( typeof f !== 'undefined' ) {\n\t\t\tfragments.goto( f );\n\t\t}\n\n\t\t// Solves an edge case where the previous slide maintains the\n\t\t// 'present' class when navigating between adjacent vertical\n\t\t// stacks\n\t\tif( previousSlide && previousSlide !== currentSlide ) {\n\t\t\tpreviousSlide.classList.remove( 'present' );\n\t\t\tpreviousSlide.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t// Reset all slides upon navigate to home\n\t\t\tif( isFirstSlide() ) {\n\t\t\t\t// Launch async task\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tgetVerticalStacks().forEach( slide => {\n\t\t\t\t\t\tsetPreviousVerticalIndex( slide, 0 );\n\t\t\t\t\t} );\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t}\n\n\t\t// Apply the new state\n\t\tstateLoop: for( let i = 0, len = state.length; i < len; i++ ) {\n\t\t\t// Check if this state existed on the previous slide. If it\n\t\t\t// did, we will avoid adding it repeatedly\n\t\t\tfor( let j = 0; j < stateBefore.length; j++ ) {\n\t\t\t\tif( stateBefore[j] === state[i] ) {\n\t\t\t\t\tstateBefore.splice( j, 1 );\n\t\t\t\t\tcontinue stateLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.classList.add( state[i] );\n\n\t\t\t// Dispatch custom event matching the state's name\n\t\t\tdispatchEvent({ type: state[i] });\n\t\t}\n\n\t\t// Clean up the remains of the previous state\n\t\twhile( stateBefore.length ) {\n\t\t\tdom.viewport.classList.remove( stateBefore.pop() );\n\t\t}\n\n\t\tif( slideChanged ) {\n\t\t\tdispatchSlideChanged( origin );\n\t\t}\n\n\t\t// Handle embedded content\n\t\tif( slideChanged || !previousSlide ) {\n\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\t// Announce the current slide contents to screen readers\n\t\t// Use animation frame to prevent getComputedStyle in getStatusText\n\t\t// from triggering layout mid-frame\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tprogress.update();\n\t\tcontrols.update();\n\t\tnotes.update();\n\t\tbackgrounds.update();\n\t\tbackgrounds.updateParallax();\n\t\tslideNumber.update();\n\t\tfragments.update();\n\n\t\t// Update the URL hash\n\t\tlocation.writeURL();\n\n\t\tcueAutoSlide();\n\n\t\t// Auto-animation\n\t\tif( autoAnimateTransition ) {\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tdom.slides.classList.remove( 'disable-slide-transitions' );\n\t\t\t}, 0 );\n\n\t\t\tif( config.autoAnimate ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks whether or not an auto-animation should take place between\n\t * the two given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t * @param {number} indexhBefore\n\t * @param {number} indexvBefore\n\t *\n\t * @returns {boolean}\n\t */\n\tfunction shouldAutoAnimateBetween( fromSlide, toSlide, indexhBefore, indexvBefore ) {\n\n\t\treturn \tfromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) &&\n\t\t\t\tfromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) &&\n\t\t\t\t!( ( indexh > indexhBefore || indexv > indexvBefore ) ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' );\n\n\t}\n\n\t/**\n\t * Called anytime a new slide should be activated while in the scroll\n\t * view. The active slide is the page that occupies the most space in\n\t * the scrollable viewport.\n\t *\n\t * @param {number} pageIndex\n\t * @param {HTMLElement} slideElement\n\t */\n\tfunction setCurrentScrollPage( slideElement, h, v ) {\n\n\t\tlet indexhBefore = indexh || 0;\n\n\t\tindexh = h;\n\t\tindexv = v;\n\n\t\tconst slideChanged = currentSlide !== slideElement;\n\n\t\tpreviousSlide = currentSlide;\n\t\tcurrentSlide = slideElement;\n\n\t\tif( currentSlide && previousSlide ) {\n\t\t\tif( config.autoAnimate && shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexv ) ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\t\t}\n\n\t\t// Start or stop embedded content like videos and iframes\n\t\tif( slideChanged ) {\n\t\t\tif( previousSlide ) {\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide.slideBackgroundElement );\n\t\t\t}\n\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide.slideBackgroundElement );\n\t\t}\n\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tdispatchSlideChanged();\n\n\t}\n\n\t/**\n\t * Syncs the presentation with the current DOM. Useful\n\t * when new slides or control elements are added or when\n\t * the configuration has changed.\n\t */\n\tfunction sync() {\n\n\t\t// Subscribe to input\n\t\tremoveEventListeners();\n\t\taddEventListeners();\n\n\t\t// Force a layout to make sure the current config is accounted for\n\t\tlayout();\n\n\t\t// Reflect the current autoSlide value\n\t\tautoSlide = config.autoSlide;\n\n\t\t// Start auto-sliding if it's enabled\n\t\tcueAutoSlide();\n\n\t\t// Re-create all slide backgrounds\n\t\tbackgrounds.create();\n\n\t\t// Write the current hash to the URL\n\t\tlocation.writeURL();\n\n\t\tif( config.sortFragmentsOnSync === true ) {\n\t\t\tfragments.sortAll();\n\t\t}\n\n\t\tcontrols.update();\n\t\tprogress.update();\n\n\t\tupdateSlidesVisibility();\n\n\t\tnotes.update();\n\t\tnotes.updateVisibility();\n\t\toverlay.update();\n\t\tbackgrounds.update( true );\n\t\tslideNumber.update();\n\t\tslideContent.formatEmbeddedContent();\n\n\t\t// Start or stop embedded content depending on global config\n\t\tif( config.autoPlayMedia === false ) {\n\t\t\tslideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } );\n\t\t}\n\t\telse {\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\tif( overview.isActive() ) {\n\t\t\toverview.layout();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates reveal.js to keep in sync with new slide attributes. For\n\t * example, if you add a new `data-background-image` you can call\n\t * this to have reveal.js render the new background image.\n\t *\n\t * Similar to #sync() but more efficient when you only need to\n\t * refresh a specific slide.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tfunction syncSlide( slide = currentSlide ) {\n\n\t\tbackgrounds.sync( slide );\n\t\tfragments.sync( slide );\n\n\t\tslideContent.load( slide );\n\n\t\tbackgrounds.update();\n\t\tnotes.update();\n\n\t}\n\n\t/**\n\t * Resets all vertical slides so that only the first\n\t * is visible.\n\t */\n\tfunction resetVerticalSlides() {\n\n\t\tgetHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tUtil.queryAll( horizontalSlide, 'section' ).forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tif( y > 0 ) {\n\t\t\t\t\tverticalSlide.classList.remove( 'present' );\n\t\t\t\t\tverticalSlide.classList.remove( 'past' );\n\t\t\t\t\tverticalSlide.classList.add( 'future' );\n\t\t\t\t\tverticalSlide.setAttribute( 'aria-hidden', 'true' );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Randomly shuffles all slides in the deck.\n\t */\n\tfunction shuffle( slides = getHorizontalSlides() ) {\n\n\t\tslides.forEach( ( slide, i ) => {\n\n\t\t\t// Insert the slide next to a randomly picked sibling slide\n\t\t\t// slide. This may cause the slide to insert before itself,\n\t\t\t// but that's not an issue.\n\t\t\tlet beforeSlide = slides[ Math.floor( Math.random() * slides.length ) ];\n\t\t\tif( beforeSlide.parentNode === slide.parentNode ) {\n\t\t\t\tslide.parentNode.insertBefore( slide, beforeSlide );\n\t\t\t}\n\n\t\t\t// Randomize the order of vertical slides (if there are any)\n\t\t\tlet verticalSlides = slide.querySelectorAll( 'section' );\n\t\t\tif( verticalSlides.length ) {\n\t\t\t\tshuffle( verticalSlides );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates one dimension of slides by showing the slide\n\t * with the specified index.\n\t *\n\t * @param {string} selector A CSS selector that will fetch\n\t * the group of slides we are working with\n\t * @param {number} index The index of the slide that should be\n\t * shown\n\t *\n\t * @return {number} The index of the slide that is now shown,\n\t * might differ from the passed in index if it was out of\n\t * bounds.\n\t */\n\tfunction updateSlides( selector, index ) {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet slides = Util.queryAll( dom.wrapper, selector ),\n\t\t\tslidesLength = slides.length;\n\n\t\tlet printMode = scrollView.isActive() || printView.isActive();\n\t\tlet loopedForwards = false;\n\t\tlet loopedBackwards = false;\n\n\t\tif( slidesLength ) {\n\n\t\t\t// Should the index loop?\n\t\t\tif( config.loop ) {\n\t\t\t\tif( index >= slidesLength ) loopedForwards = true;\n\n\t\t\t\tindex %= slidesLength;\n\n\t\t\t\tif( index < 0 ) {\n\t\t\t\t\tindex = slidesLength + index;\n\t\t\t\t\tloopedBackwards = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Enforce max and minimum index bounds\n\t\t\tindex = Math.max( Math.min( index, slidesLength - 1 ), 0 );\n\n\t\t\tfor( let i = 0; i < slidesLength; i++ ) {\n\t\t\t\tlet element = slides[i];\n\n\t\t\t\tlet reverse = config.rtl && !isVerticalSlide( element );\n\n\t\t\t\t// Avoid .remove() with multiple args for IE11 support\n\t\t\t\telement.classList.remove( 'past' );\n\t\t\t\telement.classList.remove( 'present' );\n\t\t\t\telement.classList.remove( 'future' );\n\n\t\t\t\t// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute\n\t\t\t\telement.setAttribute( 'hidden', '' );\n\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t\t// If this element contains vertical slides\n\t\t\t\tif( element.querySelector( 'section' ) ) {\n\t\t\t\t\telement.classList.add( 'stack' );\n\t\t\t\t}\n\n\t\t\t\t// If we're printing static slides, all slides are \"present\"\n\t\t\t\tif( printMode ) {\n\t\t\t\t\telement.classList.add( 'present' );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif( i < index ) {\n\t\t\t\t\t// Any element previous to index is given the 'past' class\n\t\t\t\t\telement.classList.add( reverse ? 'future' : 'past' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Show all fragments in prior slides\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( i > index ) {\n\t\t\t\t\t// Any element subsequent to index is given the 'future' class\n\t\t\t\t\telement.classList.add( reverse ? 'past' : 'future' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Hide all fragments in future slides\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Update the visibility of fragments when a presentation loops\n\t\t\t\t// in either direction\n\t\t\t\telse if( i === index && config.fragments ) {\n\t\t\t\t\tif( loopedForwards ) {\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t\telse if( loopedBackwards ) {\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet slide = slides[index];\n\t\t\tlet wasPresent = slide.classList.contains( 'present' );\n\n\t\t\t// Mark the current slide as present\n\t\t\tslide.classList.add( 'present' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\n\t\t\tif( !wasPresent ) {\n\t\t\t\t// Dispatch an event indicating the slide is now visible\n\t\t\t\tdispatchEvent({\n\t\t\t\t\ttarget: slide,\n\t\t\t\t\ttype: 'visible',\n\t\t\t\t\tbubbles: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If this slide has a state associated with it, add it\n\t\t\t// onto the current state of the deck\n\t\t\tlet slideState = slide.getAttribute( 'data-state' );\n\t\t\tif( slideState ) {\n\t\t\t\tstate = state.concat( slideState.split( ' ' ) );\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\t// Since there are no slides we can't be anywhere beyond the\n\t\t\t// zeroth index\n\t\t\tindex = 0;\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Shows all fragment elements within the given container.\n\t */\n\tfunction showFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment' ).forEach( fragment => {\n\t\t\tfragment.classList.add( 'visible' );\n\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Hides all fragment elements within the given container.\n\t */\n\tfunction hideFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment.visible' ).forEach( fragment => {\n\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Optimization method; hide all slides that are far away\n\t * from the present slide.\n\t */\n\tfunction updateSlidesVisibility() {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet horizontalSlides = getHorizontalSlides(),\n\t\t\thorizontalSlidesLength = horizontalSlides.length,\n\t\t\tdistanceX,\n\t\t\tdistanceY;\n\n\t\tif( horizontalSlidesLength && typeof indexh !== 'undefined' ) {\n\n\t\t\tconst isOverview = overview.isActive();\n\n\t\t\t// The number of steps away from the present slide that will\n\t\t\t// be visible\n\t\t\tlet viewDistance = isOverview ? 10 : config.viewDistance;\n\n\t\t\t// Shorten the view distance on devices that typically have\n\t\t\t// less resources\n\t\t\tif( Device.isMobile ) {\n\t\t\t\tviewDistance = isOverview ? 6 : config.mobileViewDistance;\n\t\t\t}\n\n\t\t\t// All slides need to be visible when exporting to PDF\n\t\t\tif( printView.isActive() ) {\n\t\t\t\tviewDistance = Number.MAX_VALUE;\n\t\t\t}\n\n\t\t\tfor( let x = 0; x < horizontalSlidesLength; x++ ) {\n\t\t\t\tlet horizontalSlide = horizontalSlides[x];\n\n\t\t\t\tlet verticalSlides = Util.queryAll( horizontalSlide, 'section' ),\n\t\t\t\t\tverticalSlidesLength = verticalSlides.length;\n\n\t\t\t\t// Determine how far away this slide is from the present\n\t\t\t\tdistanceX = Math.abs( ( indexh || 0 ) - x ) || 0;\n\n\t\t\t\t// If the presentation is looped, distance should measure\n\t\t\t\t// 1 between the first and last slides\n\t\t\t\tif( config.loop ) {\n\t\t\t\t\tdistanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;\n\t\t\t\t}\n\n\t\t\t\t// Show the horizontal slide if it's within the view distance\n\t\t\t\tif( distanceX < viewDistance ) {\n\t\t\t\t\tslideContent.load( horizontalSlide );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslideContent.unload( horizontalSlide );\n\t\t\t\t}\n\n\t\t\t\tif( verticalSlidesLength ) {\n\n\t\t\t\t\tlet oy = isOverview ? 0 : getPreviousVerticalIndex( horizontalSlide );\n\n\t\t\t\t\tfor( let y = 0; y < verticalSlidesLength; y++ ) {\n\t\t\t\t\t\tlet verticalSlide = verticalSlides[y];\n\n\t\t\t\t\t\tdistanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy );\n\n\t\t\t\t\t\tif( distanceX + distanceY < viewDistance ) {\n\t\t\t\t\t\t\tslideContent.load( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslideContent.unload( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flag if there are ANY vertical slides, anywhere in the deck\n\t\t\tif( hasVerticalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-vertical-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-vertical-slides' );\n\t\t\t}\n\n\t\t\t// Flag if there are ANY horizontal slides, anywhere in the deck\n\t\t\tif( hasHorizontalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-horizontal-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-horizontal-slides' );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Determine what available routes there are for navigation.\n\t *\n\t * @return {{left: boolean, right: boolean, up: boolean, down: boolean}}\n\t */\n\tfunction availableRoutes({ includeFragments = false } = {}) {\n\n\t\tlet horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),\n\t\t\tverticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR );\n\n\t\tlet routes = {\n\t\t\tleft: indexh > 0,\n\t\t\tright: indexh < horizontalSlides.length - 1,\n\t\t\tup: indexv > 0,\n\t\t\tdown: indexv < verticalSlides.length - 1\n\t\t};\n\n\t\t// Looped presentations can always be navigated as long as\n\t\t// there are slides available\n\t\tif( config.loop ) {\n\t\t\tif( horizontalSlides.length > 1 ) {\n\t\t\t\troutes.left = true;\n\t\t\t\troutes.right = true;\n\t\t\t}\n\n\t\t\tif( verticalSlides.length > 1 ) {\n\t\t\t\troutes.up = true;\n\t\t\t\troutes.down = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( horizontalSlides.length > 1 && config.navigationMode === 'linear' ) {\n\t\t\troutes.right = routes.right || routes.down;\n\t\t\troutes.left = routes.left || routes.up;\n\t\t}\n\n\t\t// If includeFragments is set, a route will be considered\n\t\t// available if either a slid OR fragment is available in\n\t\t// the given direction\n\t\tif( includeFragments === true ) {\n\t\t\tlet fragmentRoutes = fragments.availableRoutes();\n\t\t\troutes.left = routes.left || fragmentRoutes.prev;\n\t\t\troutes.up = routes.up || fragmentRoutes.prev;\n\t\t\troutes.down = routes.down || fragmentRoutes.next;\n\t\t\troutes.right = routes.right || fragmentRoutes.next;\n\t\t}\n\n\t\t// Reverse horizontal controls for rtl\n\t\tif( config.rtl ) {\n\t\t\tlet left = routes.left;\n\t\t\troutes.left = routes.right;\n\t\t\troutes.right = left;\n\t\t}\n\n\t\treturn routes;\n\n\t}\n\n\t/**\n\t * Returns the number of past slides. This can be used as a global\n\t * flattened index for slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide we're counting before\n\t *\n\t * @return {number} Past slide count\n\t */\n\tfunction getSlidePastCount( slide = currentSlide ) {\n\n\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t// The number of past slides\n\t\tlet pastCount = 0;\n\n\t\t// Step through all slides and count the past ones\n\t\tmainLoop: for( let i = 0; i < horizontalSlides.length; i++ ) {\n\n\t\t\tlet horizontalSlide = horizontalSlides[i];\n\t\t\tlet verticalSlides = horizontalSlide.querySelectorAll( 'section' );\n\n\t\t\tfor( let j = 0; j < verticalSlides.length; j++ ) {\n\n\t\t\t\t// Stop as soon as we arrive at the present\n\t\t\t\tif( verticalSlides[j] === slide ) {\n\t\t\t\t\tbreak mainLoop;\n\t\t\t\t}\n\n\t\t\t\t// Don't count slides with the \"uncounted\" class\n\t\t\t\tif( verticalSlides[j].dataset.visibility !== 'uncounted' ) {\n\t\t\t\t\tpastCount++;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Stop as soon as we arrive at the present\n\t\t\tif( horizontalSlide === slide ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Don't count the wrapping section for vertical slides and\n\t\t\t// slides marked as uncounted\n\t\t\tif( horizontalSlide.classList.contains( 'stack' ) === false && horizontalSlide.dataset.visibility !== 'uncounted' ) {\n\t\t\t\tpastCount++;\n\t\t\t}\n\n\t\t}\n\n\t\treturn pastCount;\n\n\t}\n\n\t/**\n\t * Returns a value ranging from 0-1 that represents\n\t * how far into the presentation we have navigated.\n\t *\n\t * @return {number}\n\t */\n\tfunction getProgress() {\n\n\t\t// The number of past and total slides\n\t\tlet totalCount = getTotalSlides();\n\t\tlet pastCount = getSlidePastCount();\n\n\t\tif( currentSlide ) {\n\n\t\t\tlet allFragments = currentSlide.querySelectorAll( '.fragment' );\n\n\t\t\t// If there are fragments in the current slide those should be\n\t\t\t// accounted for in the progress.\n\t\t\tif( allFragments.length > 0 ) {\n\t\t\t\tlet visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );\n\n\t\t\t\t// This value represents how big a portion of the slide progress\n\t\t\t\t// that is made up by its fragments (0-1)\n\t\t\t\tlet fragmentWeight = 0.9;\n\n\t\t\t\t// Add fragment progress to the past slide count\n\t\t\t\tpastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight;\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.min( pastCount / ( totalCount - 1 ), 1 );\n\n\t}\n\n\t/**\n\t * Retrieves the h/v location and fragment of the current,\n\t * or specified, slide.\n\t *\n\t * @param {HTMLElement} [slide] If specified, the returned\n\t * index will be for this slide rather than the currently\n\t * active one\n\t *\n\t * @return {{h: number, v: number, f: number}}\n\t */\n\tfunction getIndices( slide ) {\n\n\t\t// By default, return the current indices\n\t\tlet h = indexh,\n\t\t\tv = indexv,\n\t\t\tf;\n\n\t\t// If a slide is specified, return the indices of that slide\n\t\tif( slide ) {\n\t\t\t// In scroll mode the original h/x index is stored on the slide\n\t\t\tif( scrollView.isActive() ) {\n\t\t\t\th = parseInt( slide.getAttribute( 'data-index-h' ), 10 );\n\n\t\t\t\tif( slide.getAttribute( 'data-index-v' ) ) {\n\t\t\t\t\tv = parseInt( slide.getAttribute( 'data-index-v' ), 10 );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet isVertical = isVerticalSlide( slide );\n\t\t\t\tlet slideh = isVertical ? slide.parentNode : slide;\n\n\t\t\t\t// Select all horizontal slides\n\t\t\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t\t\t// Now that we know which the horizontal slide is, get its index\n\t\t\t\th = Math.max( horizontalSlides.indexOf( slideh ), 0 );\n\n\t\t\t\t// Assume we're not vertical\n\t\t\t\tv = undefined;\n\n\t\t\t\t// If this is a vertical slide, grab the vertical index\n\t\t\t\tif( isVertical ) {\n\t\t\t\t\tv = Math.max( Util.queryAll( slide.parentNode, 'section' ).indexOf( slide ), 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !slide && currentSlide ) {\n\t\t\tlet hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;\n\t\t\tif( hasFragments ) {\n\t\t\t\tlet currentFragment = currentSlide.querySelector( '.current-fragment' );\n\t\t\t\tif( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\tf = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tf = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { h, v, f };\n\n\t}\n\n\t/**\n\t * Retrieves all slides in this presentation.\n\t */\n\tfunction getSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, SLIDES_SELECTOR + ':not(.stack):not([data-visibility=\"uncounted\"])' );\n\n\t}\n\n\t/**\n\t * Returns a list of all horizontal slides in the deck. Each\n\t * vertical stack is included as one horizontal slide in the\n\t * resulting array.\n\t */\n\tfunction getHorizontalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR );\n\n\t}\n\n\t/**\n\t * Returns all vertical slides that exist within this deck.\n\t */\n\tfunction getVerticalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, '.slides>section>section' );\n\n\t}\n\n\t/**\n\t * Returns all vertical stacks (each stack can contain multiple slides).\n\t */\n\tfunction getVerticalStacks() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.stack');\n\n\t}\n\n\t/**\n\t * Returns true if there are at least two horizontal slides.\n\t */\n\tfunction hasHorizontalSlides() {\n\n\t\treturn getHorizontalSlides().length > 1;\n\t}\n\n\t/**\n\t * Returns true if there are at least two vertical slides.\n\t */\n\tfunction hasVerticalSlides() {\n\n\t\treturn getVerticalSlides().length > 1;\n\n\t}\n\n\t/**\n\t * Returns an array of objects where each object represents the\n\t * attributes on its respective slide.\n\t */\n\tfunction getSlidesAttributes() {\n\n\t\treturn getSlides().map( slide => {\n\n\t\t\tlet attributes = {};\n\t\t\tfor( let i = 0; i < slide.attributes.length; i++ ) {\n\t\t\t\tlet attribute = slide.attributes[ i ];\n\t\t\t\tattributes[ attribute.name ] = attribute.value;\n\t\t\t}\n\t\t\treturn attributes;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Retrieves the total number of slides in this presentation.\n\t *\n\t * @return {number}\n\t */\n\tfunction getTotalSlides() {\n\n\t\treturn getSlides().length;\n\n\t}\n\n\t/**\n\t * Returns the slide element matching the specified index.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction getSlide( x, y ) {\n\n\t\tlet horizontalSlide = getHorizontalSlides()[ x ];\n\t\tlet verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );\n\n\t\tif( verticalSlides && verticalSlides.length && typeof y === 'number' ) {\n\t\t\treturn verticalSlides ? verticalSlides[ y ] : undefined;\n\t\t}\n\n\t\treturn horizontalSlide;\n\n\t}\n\n\t/**\n\t * Returns the background element for the given slide.\n\t * All slides, even the ones with no background properties\n\t * defined, have a background element so as long as the\n\t * index is valid an element will be returned.\n\t *\n\t * @param {mixed} x Horizontal background index OR a slide\n\t * HTML element\n\t * @param {number} y Vertical background index\n\t * @return {(HTMLElement[]|*)}\n\t */\n\tfunction getSlideBackground( x, y ) {\n\n\t\tlet slide = typeof x === 'number' ? getSlide( x, y ) : x;\n\t\tif( slide ) {\n\t\t\treturn slide.slideBackgroundElement;\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Retrieves the current state of the presentation as\n\t * an object. This state can then be restored at any\n\t * time.\n\t *\n\t * @return {{indexh: number, indexv: number, indexf: number, paused: boolean, overview: boolean}}\n\t */\n\tfunction getState() {\n\n\t\tlet indices = getIndices();\n\n\t\treturn {\n\t\t\tindexh: indices.h,\n\t\t\tindexv: indices.v,\n\t\t\tindexf: indices.f,\n\t\t\tpaused: isPaused(),\n\t\t\toverview: overview.isActive(),\n\t\t\t...overlay.getState()\n\t\t};\n\n\t}\n\n\t/**\n\t * Restores the presentation to the given state.\n\t *\n\t * @param {object} state As generated by getState()\n\t * @see {@link getState} generates the parameter `state`\n\t */\n\tfunction setState( state ) {\n\n\t\tif( typeof state === 'object' ) {\n\t\t\tslide( Util.deserialize( state.indexh ), Util.deserialize( state.indexv ), Util.deserialize( state.indexf ) );\n\n\t\t\tlet pausedFlag = Util.deserialize( state.paused ),\n\t\t\t\toverviewFlag = Util.deserialize( state.overview );\n\n\t\t\tif( typeof pausedFlag === 'boolean' && pausedFlag !== isPaused() ) {\n\t\t\t\ttogglePause( pausedFlag );\n\t\t\t}\n\n\t\t\tif( typeof overviewFlag === 'boolean' && overviewFlag !== overview.isActive() ) {\n\t\t\t\toverview.toggle( overviewFlag );\n\t\t\t}\n\n\t\t\toverlay.setState( state );\n\t\t}\n\n\t}\n\n\t/**\n\t * Cues a new automated slide if enabled in the config.\n\t */\n\tfunction cueAutoSlide() {\n\n\t\tcancelAutoSlide();\n\n\t\tif( currentSlide && config.autoSlide !== false ) {\n\n\t\t\tlet fragment = currentSlide.querySelector( '.current-fragment[data-autoslide]' );\n\n\t\t\tlet fragmentAutoSlide = fragment ? fragment.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );\n\n\t\t\t// Pick value in the following priority order:\n\t\t\t// 1. Current fragment's data-autoslide\n\t\t\t// 2. Current slide's data-autoslide\n\t\t\t// 3. Parent slide's data-autoslide\n\t\t\t// 4. Global autoSlide setting\n\t\t\tif( fragmentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( fragmentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( slideAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( slideAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( parentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( parentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tautoSlide = config.autoSlide;\n\n\t\t\t\t// If there are media elements with data-autoplay,\n\t\t\t\t// automatically set the autoSlide duration to the\n\t\t\t\t// length of that media. Not applicable if the slide\n\t\t\t\t// is divided up into fragments.\n\t\t\t\t// playbackRate is accounted for in the duration.\n\t\t\t\tif( currentSlide.querySelectorAll( '.fragment' ).length === 0 ) {\n\t\t\t\t\tUtil.queryAll( currentSlide, 'video, audio' ).forEach( el => {\n\t\t\t\t\t\tif( el.hasAttribute( 'data-autoplay' ) ) {\n\t\t\t\t\t\t\tif( autoSlide && (el.duration * 1000 / el.playbackRate ) > autoSlide ) {\n\t\t\t\t\t\t\t\tautoSlide = ( el.duration * 1000 / el.playbackRate ) + 1000;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cue the next auto-slide if:\n\t\t\t// - There is an autoSlide value\n\t\t\t// - Auto-sliding isn't paused by the user\n\t\t\t// - The presentation isn't paused\n\t\t\t// - The overview isn't active\n\t\t\t// - The presentation isn't over\n\t\t\tif( autoSlide && !autoSlidePaused && !isPaused() && !overview.isActive() && ( !isLastSlide() || fragments.availableRoutes().next || config.loop === true ) ) {\n\t\t\t\tautoSlideTimeout = setTimeout( () => {\n\t\t\t\t\tif( typeof config.autoSlideMethod === 'function' ) {\n\t\t\t\t\t\tconfig.autoSlideMethod()\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnavigateNext();\n\t\t\t\t\t}\n\t\t\t\t\tcueAutoSlide();\n\t\t\t\t}, autoSlide );\n\t\t\t\tautoSlideStartTime = Date.now();\n\t\t\t}\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Cancels any ongoing request to auto-slide.\n\t */\n\tfunction cancelAutoSlide() {\n\n\t\tclearTimeout( autoSlideTimeout );\n\t\tautoSlideTimeout = -1;\n\n\t}\n\n\tfunction pauseAutoSlide() {\n\n\t\tif( autoSlide && !autoSlidePaused ) {\n\t\t\tautoSlidePaused = true;\n\t\t\tdispatchEvent({ type: 'autoslidepaused' });\n\t\t\tclearTimeout( autoSlideTimeout );\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( false );\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction resumeAutoSlide() {\n\n\t\tif( autoSlide && autoSlidePaused ) {\n\t\t\tautoSlidePaused = false;\n\t\t\tdispatchEvent({ type: 'autoslideresumed' });\n\t\t\tcueAutoSlide();\n\t\t}\n\n\t}\n\n\tfunction navigateLeft({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().left ) {\n\t\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().left ) {\n\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateRight({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().right ) {\n\t\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().right ) {\n\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateUp({skipFragments=false}={}) {\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Prioritize hiding fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().up ) {\n\t\t\tslide( indexh, indexv - 1 );\n\t\t}\n\n\t}\n\n\tfunction navigateDown({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Prioritize revealing fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().down ) {\n\t\t\tslide( indexh, indexv + 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Navigates backwards, prioritized in the following order:\n\t * 1) Previous fragment\n\t * 2) Previous vertical slide\n\t * 3) Previous horizontal slide\n\t */\n\tfunction navigatePrev({skipFragments=false}={}) {\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.prev();\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.prev() === false ) {\n\t\t\tif( availableRoutes().up ) {\n\t\t\t\tnavigateUp({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Fetch the previous horizontal slide, if there is one\n\t\t\t\tlet previousSlide;\n\n\t\t\t\tif( config.rtl ) {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.future' ).pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.past' ).pop();\n\t\t\t\t}\n\n\t\t\t\t// When going backwards and arriving on a stack we start\n\t\t\t\t// at the bottom of the stack\n\t\t\t\tif( previousSlide && previousSlide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tlet v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;\n\t\t\t\t\tlet h = indexh - 1;\n\t\t\t\t\tslide( h, v );\n\t\t\t\t}\n\t\t\t\telse if( config.rtl ) {\n\t\t\t\t\tnavigateRight({skipFragments});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * The reverse of #navigatePrev().\n\t */\n\tfunction navigateNext({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Scroll view navigation is handled independently\n\t\tif( scrollView.isActive() ) return scrollView.next();\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.next() === false ) {\n\n\t\t\tlet routes = availableRoutes();\n\n\t\t\t// When looping is enabled `routes.down` is always available\n\t\t\t// so we need a separate check for when we've reached the\n\t\t\t// end of a stack and should move horizontally\n\t\t\tif( routes.down && routes.right && config.loop && isLastVerticalSlide() ) {\n\t\t\t\troutes.down = false;\n\t\t\t}\n\n\t\t\tif( routes.down ) {\n\t\t\t\tnavigateDown({skipFragments});\n\t\t\t}\n\t\t\telse if( config.rtl ) {\n\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnavigateRight({skipFragments});\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ----------------------------- EVENTS -------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t/**\n\t * Called by all event handlers that are based on user\n\t * input.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onUserInput( event ) {\n\n\t\tif( config.autoSlideStoppable ) {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t* Listener for post message events posted to this window.\n\t*/\n\tfunction onPostMessage( event ) {\n\n\t\tlet data = event.data;\n\n\t\t// Make sure we're dealing with JSON\n\t\tif( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) {\n\t\t\tdata = JSON.parse( data );\n\n\t\t\t// Check if the requested method can be found\n\t\t\tif( data.method && typeof Reveal[data.method] === 'function' ) {\n\n\t\t\t\tif( POST_MESSAGE_METHOD_BLACKLIST.test( data.method ) === false ) {\n\n\t\t\t\t\tconst result = Reveal[data.method].apply( Reveal, data.args );\n\n\t\t\t\t\t// Dispatch a postMessage event with the returned value from\n\t\t\t\t\t// our method invocation for getter functions\n\t\t\t\t\tdispatchPostMessage( 'callback', { method: data.method, result: result } );\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.warn( 'reveal.js: \"'+ data.method +'\" is is blacklisted from the postMessage API' );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Event listener for transition end on the current slide.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onTransitionEnd( event ) {\n\n\t\tif( transition === 'running' && /section/gi.test( event.target.nodeName ) ) {\n\t\t\ttransition = 'idle';\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'slidetransitionend',\n\t\t\t\tdata: { indexh, indexv, previousSlide, currentSlide }\n\t\t\t});\n\t\t}\n\n\t}\n\n\t/**\n\t * A global listener for all click events inside of the\n\t * .slides container.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onSlidesClicked( event ) {\n\n\t\tconst anchor = Util.closest( event.target, 'a[href^=\"#\"]' );\n\n\t\t// If a hash link is clicked, we find the target slide\n\t\t// and navigate to it. We previously relied on 'hashchange'\n\t\t// for links like these but that prevented media with\n\t\t// audio tracks from playing in mobile browsers since it\n\t\t// wasn't considered a direct interaction with the document.\n\t\tif( anchor ) {\n\t\t\tconst hash = anchor.getAttribute( 'href' );\n\t\t\tconst indices = location.getIndicesFromHash( hash );\n\n\t\t\tif( indices ) {\n\t\t\t\tReveal.slide( indices.h, indices.v, indices.f );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the window level 'resize' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onWindowResize( event ) {\n\n\t\tlayout();\n\t}\n\n\t/**\n\t * Handle for the window level 'visibilitychange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onPageVisibilityChange( event ) {\n\n\t\t// If, after clicking a link or similar and we're coming back,\n\t\t// focus the document.body to ensure we can use keyboard shortcuts\n\t\tif( document.hidden === false && document.activeElement !== document.body ) {\n\t\t\t// Not all elements support .blur() - SVGs among them.\n\t\t\tif( typeof document.activeElement.blur === 'function' ) {\n\t\t\t\tdocument.activeElement.blur();\n\t\t\t}\n\t\t\tdocument.body.focus();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the document level 'fullscreenchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onFullscreenChange( event ) {\n\n\t\tlet element = document.fullscreenElement || document.webkitFullscreenElement;\n\t\tif( element === dom.wrapper ) {\n\t\t\tevent.stopImmediatePropagation();\n\n\t\t\t// Timeout to avoid layout shift in Safari\n\t\t\tsetTimeout( () => {\n\t\t\t\tReveal.layout();\n\t\t\t\tReveal.focus.focus(); // focus.focus :'(\n\t\t\t}, 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles click on the auto-sliding controls element.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onAutoSlidePlayerClick( event ) {\n\n\t\t// Replay\n\t\tif( isLastSlide() && config.loop === false ) {\n\t\t\tslide( 0, 0 );\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Resume\n\t\telse if( autoSlidePaused ) {\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Pause\n\t\telse {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ------------------------------- API --------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t// The public reveal.js API\n\tconst API = {\n\t\tVERSION,\n\n\t\tinitialize,\n\t\tconfigure,\n\t\tdestroy,\n\n\t\tsync,\n\t\tsyncSlide,\n\t\tsyncFragments: fragments.sync.bind( fragments ),\n\n\t\t// Navigation methods\n\t\tslide,\n\t\tleft: navigateLeft,\n\t\tright: navigateRight,\n\t\tup: navigateUp,\n\t\tdown: navigateDown,\n\t\tprev: navigatePrev,\n\t\tnext: navigateNext,\n\n\t\t// Navigation aliases\n\t\tnavigateLeft, navigateRight, navigateUp, navigateDown, navigatePrev, navigateNext,\n\n\t\t// Fragment methods\n\t\tnavigateFragment: fragments.goto.bind( fragments ),\n\t\tprevFragment: fragments.prev.bind( fragments ),\n\t\tnextFragment: fragments.next.bind( fragments ),\n\n\t\t// Event binding\n\t\ton,\n\t\toff,\n\n\t\t// Legacy event binding methods left in for backwards compatibility\n\t\taddEventListener: on,\n\t\tremoveEventListener: off,\n\n\t\t// Forces an update in slide layout\n\t\tlayout,\n\n\t\t// Randomizes the order of slides\n\t\tshuffle,\n\n\t\t// Returns an object with the available routes as booleans (left/right/top/bottom)\n\t\tavailableRoutes,\n\n\t\t// Returns an object with the available fragments as booleans (prev/next)\n\t\tavailableFragments: fragments.availableRoutes.bind( fragments ),\n\n\t\t// Toggles a help overlay with keyboard shortcuts\n\t\ttoggleHelp: overlay.toggleHelp.bind( overlay ),\n\n\t\t// Toggles the overview mode on/off\n\t\ttoggleOverview: overview.toggle.bind( overview ),\n\n\t\t// Toggles the scroll view on/off\n\t\ttoggleScrollView: scrollView.toggle.bind( scrollView ),\n\n\t\t// Toggles the \"black screen\" mode on/off\n\t\ttogglePause,\n\n\t\t// Toggles the auto slide mode on/off\n\t\ttoggleAutoSlide,\n\n\t\t// Toggles visibility of the jump-to-slide UI\n\t\ttoggleJumpToSlide,\n\n\t\t// Slide navigation checks\n\t\tisFirstSlide,\n\t\tisLastSlide,\n\t\tisLastVerticalSlide,\n\t\tisVerticalSlide,\n\t\tisVerticalStack,\n\n\t\t// State checks\n\t\tisPaused,\n\t\tisAutoSliding,\n\t\tisSpeakerNotes: notes.isSpeakerNotesWindow.bind( notes ),\n\t\tisOverview: overview.isActive.bind( overview ),\n\t\tisFocused: focus.isFocused.bind( focus ),\n\t\tisOverlayOpen: overlay.isOpen.bind( overlay ),\n\t\tisScrollView: scrollView.isActive.bind( scrollView ),\n\t\tisPrintView: printView.isActive.bind( printView ),\n\n\t\t// Checks if reveal.js has been loaded and is ready for use\n\t\tisReady: () => ready,\n\n\t\t// Slide preloading\n\t\tloadSlide: slideContent.load.bind( slideContent ),\n\t\tunloadSlide: slideContent.unload.bind( slideContent ),\n\n\t\t// Start/stop all media inside of the current slide\n\t\tstartEmbeddedContent: () => slideContent.startEmbeddedContent( currentSlide ),\n\t\tstopEmbeddedContent: () => slideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } ),\n\n\t\t// Lightbox previews\n\t\tpreviewIframe: overlay.previewIframe.bind( overlay ),\n\t\tpreviewImage: overlay.previewImage.bind( overlay ),\n\t\tpreviewVideo: overlay.previewVideo.bind( overlay ),\n\n\t\tshowPreview: overlay.previewIframe.bind( overlay ), // deprecated in favor of showIframeLightbox\n\t\thidePreview: overlay.close.bind( overlay ),\n\n\t\t// Adds or removes all internal event listeners\n\t\taddEventListeners,\n\t\tremoveEventListeners,\n\t\tdispatchEvent,\n\n\t\t// Facility for persisting and restoring the presentation state\n\t\tgetState,\n\t\tsetState,\n\n\t\t// Presentation progress on range of 0-1\n\t\tgetProgress,\n\n\t\t// Returns the indices of the current, or specified, slide\n\t\tgetIndices,\n\n\t\t// Returns an Array of key:value maps of the attributes of each\n\t\t// slide in the deck\n\t\tgetSlidesAttributes,\n\n\t\t// Returns the number of slides that we have passed\n\t\tgetSlidePastCount,\n\n\t\t// Returns the total number of slides\n\t\tgetTotalSlides,\n\n\t\t// Returns the slide element at the specified index\n\t\tgetSlide,\n\n\t\t// Returns the previous slide element, may be null\n\t\tgetPreviousSlide: () => previousSlide,\n\n\t\t// Returns the current slide element\n\t\tgetCurrentSlide: () => currentSlide,\n\n\t\t// Returns the slide background element at the specified index\n\t\tgetSlideBackground,\n\n\t\t// Returns the speaker notes string for a slide, or null\n\t\tgetSlideNotes: notes.getSlideNotes.bind( notes ),\n\n\t\t// Returns an Array of all slides\n\t\tgetSlides,\n\n\t\t// Returns an array with all horizontal/vertical slides in the deck\n\t\tgetHorizontalSlides,\n\t\tgetVerticalSlides,\n\n\t\t// Checks if the presentation contains two or more horizontal\n\t\t// and vertical slides\n\t\thasHorizontalSlides,\n\t\thasVerticalSlides,\n\n\t\t// Checks if the deck has navigated on either axis at least once\n\t\thasNavigatedHorizontally: () => navigationHistory.hasNavigatedHorizontally,\n\t\thasNavigatedVertically: () => navigationHistory.hasNavigatedVertically,\n\n\t\tshouldAutoAnimateBetween,\n\n\t\t// Adds/removes a custom key binding\n\t\taddKeyBinding: keyboard.addKeyBinding.bind( keyboard ),\n\t\tremoveKeyBinding: keyboard.removeKeyBinding.bind( keyboard ),\n\n\t\t// Programmatically triggers a keyboard event\n\t\ttriggerKey: keyboard.triggerKey.bind( keyboard ),\n\n\t\t// Registers a new shortcut to include in the help overlay\n\t\tregisterKeyboardShortcut: keyboard.registerKeyboardShortcut.bind( keyboard ),\n\n\t\tgetComputedSlideSize,\n\t\tsetCurrentScrollPage,\n\n\t\t// Returns the current scale of the presentation content\n\t\tgetScale: () => scale,\n\n\t\t// Returns the current configuration object\n\t\tgetConfig: () => config,\n\n\t\t// Helper method, retrieves query string as a key:value map\n\t\tgetQueryHash: Util.getQueryHash,\n\n\t\t// Returns the path to the current slide as represented in the URL\n\t\tgetSlidePath: location.getHash.bind( location ),\n\n\t\t// Returns reveal.js DOM elements\n\t\tgetRevealElement: () => revealElement,\n\t\tgetSlidesElement: () => dom.slides,\n\t\tgetViewportElement: () => dom.viewport,\n\t\tgetBackgroundsElement: () => backgrounds.element,\n\n\t\t// API for registering and retrieving plugins\n\t\tregisterPlugin: plugins.registerPlugin.bind( plugins ),\n\t\thasPlugin: plugins.hasPlugin.bind( plugins ),\n\t\tgetPlugin: plugins.getPlugin.bind( plugins ),\n\t\tgetPlugins: plugins.getRegisteredPlugins.bind( plugins )\n\n\t};\n\n\t// Our internal API which controllers have access to\n\tUtil.extend( Reveal, {\n\t\t...API,\n\n\t\t// Methods for announcing content to screen readers\n\t\tannounceStatus,\n\t\tgetStatusText,\n\n\t\t// Controllers\n\t\tfocus,\n\t\tscroll: scrollView,\n\t\tprogress,\n\t\tcontrols,\n\t\tlocation,\n\t\toverview,\n\t\tkeyboard,\n\t\tfragments,\n\t\tbackgrounds,\n\t\tslideContent,\n\t\tslideNumber,\n\n\t\tonUserInput,\n\t\tcloseOverlay: overlay.close.bind( overlay ),\n\t\tupdateSlidesVisibility,\n\t\tlayoutSlideContents,\n\t\ttransformSlides,\n\t\tcueAutoSlide,\n\t\tcancelAutoSlide\n\t} );\n\n\treturn API;\n\n};\n","import Deck, { VERSION } from './reveal.js'\n\n/**\n * Expose the Reveal class to the window. To create a\n * new instance:\n * let deck = new Reveal( document.querySelector( '.reveal' ), {\n * controls: false\n * } );\n * deck.initialize().then(() => {\n * // reveal.js is ready\n * });\n */\nlet Reveal = Deck;\n\n\n/**\n * The below is a thin shell that mimics the pre 4.0\n * reveal.js API and ensures backwards compatibility.\n * This API only allows for one Reveal instance per\n * page, whereas the new API above lets you run many\n * presentations on the same page.\n *\n * Reveal.initialize( { controls: false } ).then(() => {\n * // reveal.js is ready\n * });\n */\n\nlet enqueuedAPICalls = [];\n\nReveal.initialize = options => {\n\n\t// Create our singleton reveal.js instance\n\tObject.assign( Reveal, new Deck( document.querySelector( '.reveal' ), options ) );\n\n\t// Invoke any enqueued API calls\n\tenqueuedAPICalls.map( method => method( Reveal ) );\n\n\treturn Reveal.initialize();\n\n}\n\n/**\n * The pre 4.0 API let you add event listener before\n * initializing. We maintain the same behavior by\n * queuing up premature API calls and invoking all\n * of them when Reveal.initialize is called.\n */\n[ 'configure', 'on', 'off', 'addEventListener', 'removeEventListener', 'registerPlugin' ].forEach( method => {\n\tReveal[method] = ( ...args ) => {\n\t\tenqueuedAPICalls.push( deck => deck[method].call( null, ...args ) );\n\t}\n} );\n\nReveal.isReady = () => false;\n\nReveal.VERSION = VERSION;\n\nexport default Reveal;"],"names":["extend","a","b","i","queryAll","el","selector","Array","from","querySelectorAll","toggleClass","className","value","classList","add","remove","deserialize","match","parseFloat","transformElement","element","transform","style","matches","target","matchesMethod","matchesSelector","msMatchesSelector","call","closest","parentNode","enterFullscreen","requestMethod","document","documentElement","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","apply","createStyleSheet","tag","createElement","type","length","styleSheet","cssText","appendChild","createTextNode","head","getQueryHash","query","location","search","replace","split","shift","pop","unescape","fileExtensionToMimeMap","mp4","m4a","ogv","mpeg","webm","UA","navigator","userAgent","isMobile","test","platform","maxTouchPoints","isAndroid","e","t","slice","o","l","u","cancelAnimationFrame","requestAnimationFrame","s","filter","dirty","active","c","forEach","styleComputed","m","y","v","p","d","f","S","availableWidth","clientWidth","currentWidth","scrollWidth","previousFontSize","currentFontSize","Math","min","max","minSize","maxSize","whiteSpace","multiLine","n","getComputedStyle","getPropertyValue","display","preStyleTestCompleted","fontSize","dispatchEvent","CustomEvent","detail","oldValue","newValue","scaleFactor","h","w","observeMutations","observer","disconnect","originalStyle","z","F","MutationObserver","observe","g","subtree","childList","characterData","W","E","clearTimeout","setTimeout","x","observeWindowDelay","M","Object","defineProperty","set","concat","observeWindow","fitAll","C","assign","map","newbie","push","fit","unfreeze","freeze","unsubscribe","arguments","window","SlideContent","allowedToPlay","constructor","Reveal","this","startEmbeddedIframe","bind","ensureMobileMediaPlaying","shouldPreload","isScrollView","preload","getConfig","preloadIframes","hasAttribute","load","slide","options","displayValue","includes","trim","setProperty","tagName","setAttribute","getAttribute","removeAttribute","media","sources","source","background","slideBackgroundElement","backgroundContent","slideBackgroundContentElement","backgroundIframe","backgroundImage","backgroundVideo","backgroundVideoLoop","backgroundVideoMuted","encodeRFC3986URI","url","encodeURI","charCodeAt","toString","toUpperCase","decodeURI","join","video","isSpeakerNotes","muted","sourceElement","getMimeTypeFromFile","filename","excludeIframes","iframe","width","height","maxHeight","maxWidth","backgroundIframeElement","querySelector","layout","scopeElement","fitty","unload","getSlideBackground","formatEmbeddedContent","_appendParamToIframeSource","sourceAttribute","sourceURL","param","getSlidesElement","src","indexOf","startEmbeddedContent","isSpeakerNotesWindow","autoplay","autoPlayMedia","play","readyState","startEmbeddedMedia","promise","addEventListener","catch","controls","then","removeEventListener","event","getVideoPlaybackQuality","playing","paused","totalFrames","totalVideoFrames","isAttachedToDOM","isVisible","ended","currentTime","error","name","preventIframeAutoFocus","elapsed","interval","maxTime","checkFocus","activeElement","blur","contentWindow","postMessage","stopEmbeddedContent","unloadIframes","pause","isNotAllowedToPlay","SLIDES_SELECTOR","HORIZONTAL_SLIDES_SELECTOR","VERTICAL_SLIDES_SELECTOR","POST_MESSAGE_METHOD_BLACKLIST","SlideNumber","render","getRevealElement","configure","config","oldConfig","slideNumberDisplay","slideNumber","isPrintView","showSlideNumber","update","innerHTML","getSlideNumber","getCurrentSlide","format","getHorizontalSlides","horizontalOffset","dataset","visibility","getSlidePastCount","getTotalSlides","indices","getIndices","sep","isVerticalSlide","getHash","formatNumber","delimiter","isNaN","destroy","JumpToSlide","onInput","onBlur","onKeyDown","jumpInput","placeholder","show","indicesOnShow","focus","hide","jumpTimeout","jump","slideNumberFormat","getSlides","parseInt","getIndicesFromHash","oneBasedIndex","jumpAfter","delay","regex","RegExp","find","innerText","cancel","confirm","keyCode","stopImmediatePropagation","colorToRgb","color","hex3","r","charAt","hex6","rgb","rgba","Backgrounds","create","slideh","backgroundStack","createBackground","slidev","parallaxBackgroundImage","backgroundSize","parallaxBackgroundSize","backgroundRepeat","parallaxBackgroundRepeat","backgroundPosition","parallaxBackgroundPosition","container","contentElement","sync","data","backgroundColor","backgroundGradient","backgroundTransition","backgroundOpacity","dataPreload","opacity","contrastClass","getContrastClass","contrastColor","computedBackgroundStyle","bubbleSlideContrastClassToElement","classToBubble","contains","includeAll","currentSlide","currentBackground","horizontalPast","rtl","horizontalFuture","childNodes","backgroundh","backgroundv","indexv","previousBackground","previousBackgroundHash","currentBackgroundHash","currentVideo","previousVideo","currentVideoParent","backgroundChanged","slideContent","currentBackgroundContent","backgroundImageURL","updateParallax","backgroundWidth","backgroundHeight","horizontalSlides","verticalSlides","getVerticalSlides","horizontalOffsetMultiplier","slideWidth","offsetWidth","horizontalSlideCount","parallaxBackgroundHorizontal","verticalOffsetMultiplier","verticalOffset","slideHeight","offsetHeight","verticalSlideCount","parallaxBackgroundVertical","autoAnimateCounter","AutoAnimate","run","fromSlide","toSlide","reset","allSlides","toSlideIndex","fromSlideIndex","autoAnimateStyleSheet","animationOptions","getAutoAnimateOptions","autoAnimate","slideDirection","fromSlideIsHidden","css","getAutoAnimatableElements","elements","autoAnimateElements","to","autoAnimateUnmatched","defaultUnmatchedDuration","duration","defaultUnmatchedDelay","getUnmatchedAutoAnimateElements","unmatchedElement","unmatchedOptions","id","autoAnimateTarget","fontWeight","sheet","removeChild","elementOptions","easing","fromProps","getAutoAnimatableProperties","toProps","styles","translate","scale","presentationScale","getScale","delta","scaleX","scaleY","round","propertyName","toValue","fromValue","explicitValue","toStyleProperties","keys","inheritedOptions","autoAnimateEasing","autoAnimateDuration","autoAnimatedParent","autoAnimateDelay","direction","properties","bounds","measure","center","getBoundingClientRect","offsetLeft","offsetTop","computedStyles","autoAnimateStyles","property","pairs","autoAnimateMatcher","getAutoAnimatePairs","reserved","pair","index","textNodes","findAutoAnimateMatches","node","nodeName","textContent","getLocalBoundingBox","fromScope","toScope","serializer","fromMatches","toMatches","key","fromElement","primaryIndex","secondaryIndex","rootElement","children","reduce","result","containsAnimatedElements","ScrollView","activatedCallbacks","onScroll","activate","stateBeforeActivation","getState","slideHTMLBeforeActivation","horizontalBackgrounds","presentationBackground","viewportElement","viewportStyles","pageElements","pageContainer","previousSlide","createPageElement","isVertical","contentContainer","shouldAutoAnimateBetween","page","slideBackground","pageBackground","stickyContainer","insertBefore","horizontalSlide","isVerticalStack","verticalSlide","createProgressBar","stack","setState","callback","restoreScrollPosition","passive","deactivate","stateBeforeDeactivation","removeProgressBar","toggle","override","isActive","progressBar","progressBarInner","progressBarPlayhead","firstChild","handleDocumentMouseMove","progress","clientY","top","progressBarHeight","scrollTop","scrollHeight","handleDocumentMouseUp","draggingProgressBar","showProgressBar","preventDefault","syncPages","syncScrollPosition","slideSize","getComputedSlideSize","innerWidth","innerHeight","useCompactLayout","scrollLayout","viewportHeight","compactHeight","pageHeight","scrollTriggerHeight","scrollSnapType","scrollSnap","slideTriggers","pages","pageElement","createPage","slideElement","stickyElement","backgroundElement","autoAnimatePages","activatePage","deactivatePage","createFragmentTriggersForPage","createAutoAnimateTriggersForPage","totalScrollTriggerCount","scrollTriggers","total","triggerStick","scrollSnapAlign","marginTop","removeProperty","scrollPadding","totalHeight","position","setTriggerRanges","scrollProgress","syncProgressBar","trigger","rangeStart","range","scrollTriggerSegmentSize","scrollTrigger","fragmentGroups","fragments","sort","autoAnimateElement","autoAnimatePage","indexh","viewportHeightFactor","playheadHeight","progressBarScrollableHeight","progressSegmentHeight","spacing","slideTrigger","progressBarSlide","scrollTriggerElements","triggerElement","scrollProgressMid","activePage","loaded","activateTrigger","deactivateTrigger","setProgressBarValue","getAllPages","hideProgressBarTimeout","prev","next","scrollToSlide","getScrollTriggerBySlide","storeScrollPosition","storeScrollPositionTimeout","sessionStorage","setItem","origin","pathname","scrollPosition","getItem","scrollOrigin","setCurrentScrollPage","backgrounds","sibling","getSlideByIndices","flatMap","getViewportElement","PrintView","slides","injectPageNumbers","pageWidth","floor","margin","Promise","body","layoutSlideContents","slideScrollHeights","left","contentHeight","numberOfPages","ceil","pdfMaxPagesPerSlide","pdfPageHeightOffset","showNotes","notes","getSlideNotes","notesSpacing","notesLayout","notesElement","bottom","numberElement","pdfSeparateFragments","previousFragmentStep","fragment","clonedPage","cloneNode","fragmentNumber","view","Fragments","disable","enable","availableRoutes","hiddenFragments","grouped","ordered","unordered","sorted","group","sortAll","changedFragments","shown","hidden","maxIndex","currentFragment","wasVisible","announceStatus","getStatusText","bubbles","goto","offset","lastVisibleFragment","fragmentInURL","writeURL","Overview","onSlideClicked","overview","cancelAutoSlide","getBackgroundsElement","overviewSlideWidth","overviewSlideHeight","updateSlidesVisibility","hslide","vslide","hbackground","vbackground","vmin","transformSlides","cueAutoSlide","Keyboard","shortcuts","bindings","onDocumentKeyDown","navigationMode","unbind","addKeyBinding","binding","description","removeKeyBinding","triggerKey","registerKeyboardShortcut","getShortcuts","getBindings","keyboardCondition","isFocused","autoSlideWasPaused","isAutoSliding","onUserInput","activeElementIsCE","isContentEditable","activeElementIsInput","activeElementIsNotes","unusedModifier","shiftKey","altKey","ctrlKey","metaKey","resumeKeyCodes","keyboard","isOverlayOpen","isPaused","useLinearMode","hasHorizontalSlides","hasVerticalSlides","triggered","action","skipFragments","right","undefined","up","Number","MAX_VALUE","down","togglePause","embedded","autoSlideStoppable","toggleAutoSlide","jumpToSlide","toggleJumpToSlide","closeOverlay","toggleHelp","Location","MAX_REPLACE_STATE_FREQUENCY","writeURLTimeout","replaceStateTimestamp","onWindowHashChange","hash","bits","hashIndexBase","hashOneBasedIndex","getElementById","decodeURIComponent","readURL","currentIndices","newIndices","history","debouncedReplaceState","replaceState","Date","now","replaceStateTimeout","encodeURIComponent","Controls","onNavigateLeftClicked","onNavigateRightClicked","onNavigateUpClicked","onNavigateDownClicked","onNavigatePrevClicked","onNavigateNextClicked","onEnterFullscreen","revealElement","controlsLeft","controlsRight","controlsUp","controlsDown","controlsPrev","controlsNext","controlsFullscreen","controlsRightArrow","controlsLeftArrow","controlsDownArrow","controlsLayout","controlsBackArrows","pointerEvents","eventName","routes","fragmentsRoutes","hasVerticalSiblings","parentElement","controlsTutorial","hasNavigatedVertically","hasNavigatedHorizontally","viewport","Progress","onProgressClicked","bar","getProgress","getMaxWidth","slidesTotal","slideIndex","clientX","targetIndices","Pointer","lastMouseWheelStep","cursorHidden","cursorInactiveTimeout","onDocumentCursorActive","onDocumentMouseScroll","mouseWheel","hideInactiveCursor","showCursor","cursor","hideCursor","hideCursorTime","wheelDelta","loadScript","script","async","defer","onload","onreadystatechange","onerror","err","Error","lastChild","Plugins","reveal","state","registeredPlugins","asyncDependencies","plugins","dependencies","registerPlugin","resolve","scripts","scriptsToLoad","condition","scriptLoadedCallback","initPlugins","console","warn","pluginValues","values","pluginsToInitialize","loadAsync","initNextPlugin","afterPlugInitialized","plugin","init","hasPlugin","getPlugin","getRegisteredPlugins","Overlay","onSlidesClicked","iframeTriggerSelector","mediaTriggerSelector","stateProps","previewLinks","hasLinkPreviews","hasMediaPreviews","createOverlay","dom","previewIframe","close","previewMedia","mediaType","fitMode","previewFit","previewImage","img","previewVideo","previewAutoplay","previewControls","loop","previewLoop","previewMuted","playsInline","showHelp","help","html","isOpen","every","linkTarget","mediaTarget","Touch","touchStartX","touchStartY","touchStartCount","touchCaptured","onPointerDown","onPointerMove","onPointerUp","onTouchStart","onTouchMove","onTouchEnd","msPointerEnabled","isSwipePrevented","touches","currentX","currentY","includeFragments","deltaX","deltaY","abs","pointerType","MSPOINTER_TYPE_TOUCH","STATE_FOCUS","STATE_BLUR","Focus","onRevealPointerDown","onDocumentPointerDown","Notes","updateVisibility","hasNotes","notesElements","Playback","progressCheck","diameter","diameter2","thickness","progressOffset","canvas","context","getContext","setPlaying","wasPlaying","animate","progressBefore","radius","iconSize","endAngle","PI","startAngle","save","clearRect","beginPath","arc","fillStyle","fill","lineWidth","strokeStyle","stroke","fillRect","moveTo","lineTo","restore","on","listener","off","defaultConfig","minScale","maxScale","respondToHashChanges","disableLayout","touch","shuffle","showHiddenSlides","autoSlide","autoSlideMethod","defaultTiming","postMessageEvents","focusBodyOnPageVisibilityChange","transition","transitionSpeed","scrollActivationWidth","POSITIVE_INFINITY","viewDistance","mobileViewDistance","sortFragmentsOnSync","VERSION","Deck","autoSlidePlayer","initialized","ready","navigationHistory","slidesTransform","autoSlideTimeout","autoSlideStartTime","autoSlidePaused","scrollView","printView","pointer","overlay","start","Util","wrapper","parent","childElementCount","Device","pauseOverlay","createSingletonNode","tagname","classname","nodes","testNode","statusElement","overflow","clip","createStatusElement","setupDOM","onPostMessage","setInterval","scrollLeft","onFullscreenChange","activatePrintView","activateScrollView","removeEventListeners","activateInitialView","text","nodeType","isAriaHidden","isDisplayHidden","altText","ensurePunctuation","child","trimmedText","isReady","numberOfSlides","resume","onAutoSlidePlayerClick","addEventListeners","onWindowResize","onTransitionEnd","onPageVisibilityChange","useCapture","transforms","createEvent","initEvent","dispatchPostMessage","dispatchSlideChanged","self","message","namespace","JSON","stringify","viewportWidth","size","oldScale","presentationWidth","presentationHeight","zoom","len","checkResponsiveScrollView","remainingHeight","getRemainingHeight","newHeight","oldHeight","nw","naturalWidth","videoWidth","nh","naturalHeight","videoHeight","es","setPreviousVerticalIndex","getPreviousVerticalIndex","attributeName","isLastVerticalSlide","nextElementSibling","isFirstSlide","isLastSlide","wasPaused","defaultPrevented","stateBefore","indexhBefore","indexvBefore","updateSlides","slideChanged","currentHorizontalSlide","currentVerticalSlides","autoAnimateTransition","stateLoop","j","splice","beforeSlide","random","slidesLength","printMode","loopedForwards","loopedBackwards","reverse","showFragmentsIn","hideFragmentsIn","wasPresent","slideState","distanceX","distanceY","horizontalSlidesLength","isOverview","verticalSlidesLength","oy","fragmentRoutes","pastCount","mainLoop","getSlide","indexf","fragmentAutoSlide","parentAutoSlide","slideAutoSlide","playbackRate","navigateNext","pauseAutoSlide","resumeAutoSlide","navigateLeft","navigateRight","navigateUp","navigateDown","navigatePrev","parse","method","args","anchor","fullscreenElement","webkitFullscreenElement","API","initialize","initOptions","setViewport","syncSlide","syncFragments","navigateFragment","prevFragment","nextFragment","availableFragments","toggleOverview","toggleScrollView","loadSlide","unloadSlide","showPreview","hidePreview","pausedFlag","overviewFlag","totalCount","allFragments","fragmentWeight","getSlidesAttributes","attributes","attribute","getPreviousSlide","getSlidePath","getPlugins","scroll","enqueuedAPICalls","deck"],"mappings":"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","x_google_ignoreList":[2]}
\ No newline at end of file
diff --git a/js/config.js b/js/config.js
index ab3e129b..9ec96b7c 100644
--- a/js/config.js
+++ b/js/config.js
@@ -168,6 +168,9 @@ export default {
// - false: All iframes with data-src will be loaded only when visible
preloadIframes: null,
+ // Prevent embedded iframes from automatically focusing on themselves
+ preventIframeAutoFocus: true,
+
// Can be used to globally disable auto-animation
autoAnimate: true,
diff --git a/js/controllers/slidecontent.js b/js/controllers/slidecontent.js
index 03c5edd1..54f3bcf8 100644
--- a/js/controllers/slidecontent.js
+++ b/js/controllers/slidecontent.js
@@ -468,6 +468,24 @@ export default class SlideContent {
let iframe = event.target;
+ if( this.Reveal.getConfig().preventIframeAutoFocus ) {
+
+ let elapsed = 0;
+ const interval = 100;
+ const maxTime = 1000;
+ const checkFocus = () => {
+ if( document.activeElement === iframe ) {
+ document.activeElement.blur();
+ } else if( elapsed < maxTime ) {
+ elapsed += interval;
+ setTimeout( checkFocus, interval );
+ }
+ };
+
+ setTimeout( checkFocus, interval );
+
+ }
+
if( iframe && iframe.contentWindow ) {
let isAttachedToDOM = !!closest( event.target, 'html' ),