syncScrollPosition() {

		const viewportHeight = this.viewportElement.offsetHeight;
		const viewportHeightFactor = viewportHeight / this.viewportElement.scrollHeight;

		const scrollTop = this.viewportElement.scrollTop;
		const scrollHeight = this.viewportElement.scrollHeight - viewportHeight
		const scrollProgress = Math.max( Math.min( scrollTop / scrollHeight, 1 ), 0 );
		const scrollProgressMid = Math.max( Math.min( ( scrollTop + viewportHeight / 2 ) / this.viewportElement.scrollHeight, 1 ), 0 );

		let activePage;

		this.slideTriggers.forEach( ( trigger ) => {
			const { page } = trigger;

			const shouldPreload = scrollProgress >= trigger.range[0] - viewportHeightFactor*2 &&
														scrollProgress <= trigger.range[1] + viewportHeightFactor*2;

			// Load slides that are within the preload range
			if( shouldPreload && !page.loaded ) {
				page.loaded = true;
				this.Reveal.slideContent.load( page.slideElement );
			}
			else if( page.loaded ) {
				page.loaded = false;
				this.Reveal.slideContent.unload( page.slideElement );
			}

			// If we're within this trigger range, activate it
			if( scrollProgress >= trigger.range[0] && scrollProgress <= trigger.range[1] ) {
				this.activateTrigger( trigger );
				activePage = trigger.page;
			}
			// .. otherwise deactivate
			else if( trigger.active ) {
				this.deactivateTrigger( trigger );
			}
		} );

		// Each page can have its own scroll triggers, check if any of those
		// need to be activated/deactivated
		if( activePage ) {
			activePage.scrollTriggers.forEach( ( trigger ) => {
				if( scrollProgressMid >= trigger.range[0] && scrollProgressMid <= trigger.range[1] ) {
					this.activateTrigger( trigger );
				}
				else if( trigger.active ) {
					this.deactivateTrigger( trigger );
				}
			} );
		}

		// Update our visual progress indication
		this.setProgressBarValue( scrollTop / ( this.viewportElement.scrollHeight - viewportHeight ) );

	}
Reads the current scroll position and updates our active
trigger states accordingly.