├── examples ├── arduino │ ├── 1-empty.ino │ ├── CIRC06-sheet-OOML.pdf │ ├── 2-led_an.ino │ ├── 3-led_blink.ino │ ├── 4-dauerton.ino │ ├── 5-sirene.ino │ └── 6-melodie.ino └── robocode │ └── de │ └── cccs │ └── robocode │ ├── scala │ └── MyFirstScalaBot.scala │ └── MyFirstRobot.java ├── lib ├── img │ ├── title.jpg │ ├── arduino.jpg │ ├── hardware.jpg │ ├── shields1.jpg │ ├── shields2.jpg │ ├── warning.jpg │ ├── backtrack.jpg │ ├── breadboard.jpg │ ├── h4x0rt00lz.jpg │ ├── laserharp.jpg │ ├── lightbulb.jpg │ ├── scalatron.png │ ├── burritobomber.jpg │ ├── neuesprachen.png │ ├── trafficlights.jpg │ ├── froheweihnachten.jpg │ ├── metasploit-logo.png │ ├── reversegeocache1.jpg │ ├── reversegeocache2.jpg │ ├── robocode-anatomy.jpg │ ├── dynamitealarmclock.jpg │ ├── robocode-screenshot.png │ ├── robocode_logo_tanks.png │ └── cc.by-nc-sa.eu.svg ├── js │ ├── html5shiv.js │ ├── classList.js │ └── head.min.js └── css │ └── zenburn.css ├── plugin ├── remotes │ └── remotes.js ├── postmessage │ ├── postmessage.js │ └── example.html ├── markdown │ ├── markdown.js │ └── showdown.js ├── notes-server │ ├── client.js │ ├── index.js │ └── notes.html ├── notes │ ├── notes.js │ └── notes.html ├── zoom-js │ └── zoom.js └── highlight │ └── highlight.js ├── package.json ├── grunt.js ├── css ├── shaders │ ├── tile-flip.fs │ └── tile-flip.vs ├── print │ ├── pdf.css │ └── paper.css ├── theme │ └── cccs.css └── reveal.min.css ├── js └── reveal.min.js └── index.html /examples/arduino/1-empty.ino: -------------------------------------------------------------------------------- 1 | void setup() { 2 | } 3 | 4 | void loop() { 5 | } 6 | 7 | -------------------------------------------------------------------------------- /lib/img/title.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/title.jpg -------------------------------------------------------------------------------- /lib/img/arduino.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/arduino.jpg -------------------------------------------------------------------------------- /lib/img/hardware.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/hardware.jpg -------------------------------------------------------------------------------- /lib/img/shields1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/shields1.jpg -------------------------------------------------------------------------------- /lib/img/shields2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/shields2.jpg -------------------------------------------------------------------------------- /lib/img/warning.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/warning.jpg -------------------------------------------------------------------------------- /lib/img/backtrack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/backtrack.jpg -------------------------------------------------------------------------------- /lib/img/breadboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/breadboard.jpg -------------------------------------------------------------------------------- /lib/img/h4x0rt00lz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/h4x0rt00lz.jpg -------------------------------------------------------------------------------- /lib/img/laserharp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/laserharp.jpg -------------------------------------------------------------------------------- /lib/img/lightbulb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/lightbulb.jpg -------------------------------------------------------------------------------- /lib/img/scalatron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/scalatron.png -------------------------------------------------------------------------------- /lib/img/burritobomber.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/burritobomber.jpg -------------------------------------------------------------------------------- /lib/img/neuesprachen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/neuesprachen.png -------------------------------------------------------------------------------- /lib/img/trafficlights.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/trafficlights.jpg -------------------------------------------------------------------------------- /lib/img/froheweihnachten.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/froheweihnachten.jpg -------------------------------------------------------------------------------- /lib/img/metasploit-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/metasploit-logo.png -------------------------------------------------------------------------------- /lib/img/reversegeocache1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/reversegeocache1.jpg -------------------------------------------------------------------------------- /lib/img/reversegeocache2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/reversegeocache2.jpg -------------------------------------------------------------------------------- /lib/img/robocode-anatomy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/robocode-anatomy.jpg -------------------------------------------------------------------------------- /lib/img/dynamitealarmclock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/dynamitealarmclock.jpg -------------------------------------------------------------------------------- /lib/img/robocode-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/robocode-screenshot.png -------------------------------------------------------------------------------- /lib/img/robocode_logo_tanks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/lib/img/robocode_logo_tanks.png -------------------------------------------------------------------------------- /examples/arduino/CIRC06-sheet-OOML.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/Vortrag-GeekigeWeihnachtstage/master/examples/arduino/CIRC06-sheet-OOML.pdf -------------------------------------------------------------------------------- /examples/arduino/2-led_an.ino: -------------------------------------------------------------------------------- 1 | int ledPin1 = 13; 2 | 3 | void setup() { 4 | pinMode(ledPin1, OUTPUT); 5 | } 6 | 7 | void loop() { 8 | digitalWrite(ledPin1, HIGH); 9 | } 10 | 11 | -------------------------------------------------------------------------------- /examples/arduino/3-led_blink.ino: -------------------------------------------------------------------------------- 1 | int ledPin1 = 13; 2 | 3 | void setup() { 4 | pinMode(ledPin1, OUTPUT); 5 | } 6 | 7 | void loop() { 8 | digitalWrite(ledPin1, HIGH); 9 | delay(500); 10 | digitalWrite(ledPin1, LOW); 11 | delay(500); 12 | } 13 | 14 | -------------------------------------------------------------------------------- /lib/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | document.createElement('header'); 2 | document.createElement('nav'); 3 | document.createElement('section'); 4 | document.createElement('article'); 5 | document.createElement('aside'); 6 | document.createElement('footer'); 7 | document.createElement('hgroup'); -------------------------------------------------------------------------------- /examples/arduino/4-dauerton.ino: -------------------------------------------------------------------------------- 1 | int speakerPin = 9; 2 | 3 | void setup() { 4 | pinMode(speakerPin, OUTPUT); 5 | } 6 | 7 | void loop() { 8 | int freq = 2*443; 9 | int interval = 1000000/freq; 10 | 11 | digitalWrite(speakerPin, HIGH); 12 | delayMicroseconds(interval); 13 | digitalWrite(speakerPin, LOW); 14 | delayMicroseconds(interval); 15 | } 16 | 17 | -------------------------------------------------------------------------------- /examples/arduino/5-sirene.ino: -------------------------------------------------------------------------------- 1 | int speakerPin = 9; 2 | 3 | void setup() { 4 | pinMode(speakerPin, OUTPUT); 5 | } 6 | 7 | void loop() { 8 | int freqLow = 443; 9 | int freqHigh = 2*443; 10 | 11 | int freq=freqLow; 12 | while (freq 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 |
11 | 12 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /plugin/markdown/markdown.js: -------------------------------------------------------------------------------- 1 | // From https://gist.github.com/1343518 2 | // Modified by Hakim to handle Markdown indented with tabs 3 | (function(){ 4 | 5 | if( typeof Showdown === 'undefined' ) { 6 | throw 'The reveal.js Markdown plugin requires Showdown to be loaded'; 7 | } 8 | 9 | var sections = document.querySelectorAll( '[data-markdown]' ); 10 | 11 | for( var i = 0, len = sections.length; i < len; i++ ) { 12 | var section = sections[i]; 13 | var notes = section.querySelector( 'aside.notes' ); 14 | 15 | var template = section.querySelector( 'script' ); 16 | 17 | // strip leading whitespace so it isn't evaluated as code 18 | var text = ( template || section ).innerHTML; 19 | 20 | var leadingWs = text.match(/^\n?(\s*)/)[1].length, 21 | leadingTabs = text.match(/^\n?(\t*)/)[1].length; 22 | 23 | if( leadingTabs > 0 ) { 24 | text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); 25 | } 26 | else if( leadingWs > 1 ) { 27 | text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' ); 28 | } 29 | 30 | section.innerHTML = (new Showdown.converter()).makeHtml(text); 31 | 32 | if( notes ) { 33 | section.appendChild( notes ); 34 | } 35 | } 36 | 37 | })(); -------------------------------------------------------------------------------- /lib/js/classList.js: -------------------------------------------------------------------------------- 1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ 2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p', 7 | 8 | inputJS: 'js/reveal.js', 9 | inputCSS: 'css/reveal.css', 10 | 11 | outputJS: 'js/reveal.min.js', 12 | outputCSS: 'css/reveal.min.css', 13 | 14 | meta: { 15 | version: '2.2', 16 | banner: 17 | '/*!\n' + 18 | ' * reveal.js <%= meta.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + 19 | ' * http://lab.hakim.se/reveal-js\n' + 20 | ' * MIT licensed\n' + 21 | ' *\n' + 22 | ' * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se\n' + 23 | ' */' 24 | }, 25 | 26 | lint: { 27 | files: [ 'grunt.js', '<%= inputJS %>' ] 28 | }, 29 | 30 | // Tests will be added soon 31 | qunit: { 32 | files: [ 'test/**/*.html' ] 33 | }, 34 | 35 | min: { 36 | dist: { 37 | src: [ '', '<%= inputJS %>' ], 38 | dest: '<%= outputJS %>' 39 | } 40 | }, 41 | 42 | mincss: { 43 | compress: { 44 | files: { 45 | '<%= outputCSS %>': [ '<%= inputCSS %>' ] 46 | } 47 | } 48 | }, 49 | 50 | jshint: { 51 | options: { 52 | curly: false, 53 | eqeqeq: true, 54 | immed: true, 55 | latedef: true, 56 | newcap: true, 57 | noarg: true, 58 | sub: true, 59 | undef: true, 60 | eqnull: true, 61 | browser: true, 62 | expr: true 63 | }, 64 | globals: { 65 | head: false, 66 | module: false, 67 | console: false 68 | } 69 | }, 70 | 71 | watch: { 72 | files: [ 'grunt.js', '<%= inputJS %>', '<%= inputCSS %>' ], 73 | tasks: 'default' 74 | } 75 | 76 | }); 77 | 78 | // Dependencies 79 | grunt.loadNpmTasks( 'grunt-contrib-mincss' ); 80 | 81 | // Default task 82 | grunt.registerTask( 'default', [ 'lint', 'mincss', 'min' ] ); 83 | 84 | }; 85 | -------------------------------------------------------------------------------- /plugin/notes-server/client.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | // don't emit events from inside the previews themselves 3 | if ( window.location.search.match( /receiver/gi ) ) { return; } 4 | 5 | var socket = io.connect(window.location.origin); 6 | var socketId = Math.random().toString().slice(2); 7 | 8 | console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId); 9 | window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId); 10 | 11 | // Fires when a fragment is shown 12 | Reveal.addEventListener( 'fragmentshown', function( event ) { 13 | var fragmentData = { 14 | fragment : 'next', 15 | socketId : socketId 16 | }; 17 | socket.emit('fragmentchanged', fragmentData); 18 | } ); 19 | 20 | // Fires when a fragment is hidden 21 | Reveal.addEventListener( 'fragmenthidden', function( event ) { 22 | var fragmentData = { 23 | fragment : 'previous', 24 | socketId : socketId 25 | }; 26 | socket.emit('fragmentchanged', fragmentData); 27 | } ); 28 | 29 | // Fires when slide is changed 30 | Reveal.addEventListener( 'slidechanged', function( event ) { 31 | var nextindexh; 32 | var nextindexv; 33 | var slideElement = event.currentSlide; 34 | 35 | if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') { 36 | nextindexh = event.indexh; 37 | nextindexv = event.indexv + 1; 38 | } else { 39 | nextindexh = event.indexh + 1; 40 | nextindexv = 0; 41 | } 42 | 43 | var notes = slideElement.querySelector('aside.notes'); 44 | var slideData = { 45 | notes : notes ? notes.innerHTML : '', 46 | indexh : event.indexh, 47 | indexv : event.indexv, 48 | nextindexh : nextindexh, 49 | nextindexv : nextindexv, 50 | socketId : socketId, 51 | markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false 52 | 53 | }; 54 | 55 | socket.emit('slidechanged', slideData); 56 | } ); 57 | }()); 58 | -------------------------------------------------------------------------------- /css/shaders/tile-flip.fs: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2012 Adobe Systems Incorporated. All rights reserved. 3 | * Copyright (c) 2012 Branislav Ulicny 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | precision mediump float; 19 | 20 | // Uniform values from CSS 21 | 22 | uniform float amount; 23 | uniform float tileOutline; 24 | 25 | // Built-in uniforms 26 | 27 | uniform vec2 u_meshSize; 28 | uniform vec2 u_textureSize; 29 | 30 | // Varyings passed in from vertex shader 31 | 32 | varying float v_depth; 33 | varying vec2 v_uv; 34 | 35 | // Main 36 | 37 | void main() 38 | { 39 | // FIXME: Must swap x and y as a workaround for: 40 | // https://bugs.webkit.org/show_bug.cgi?id=96285 41 | vec2 u_meshSize = u_meshSize.yx; 42 | 43 | vec4 c = vec4(1.0); 44 | 45 | // Fade out. 46 | c.a = 1.0 - v_depth; 47 | 48 | // Show grid outline. 49 | if (tileOutline >= 0.5) { 50 | float cell_width = u_textureSize.x / u_meshSize.y; 51 | float cell_height = u_textureSize.y / u_meshSize.x; 52 | float dd = 1.0; 53 | 54 | if (mod(v_uv.x * u_textureSize.x + dd, cell_width) < 2.0 55 | || mod(v_uv.y * u_textureSize.y + dd, cell_height) < 2.0) { 56 | if (amount > 0.0) 57 | c.rgb = vec3(1.0 - sqrt(amount)); 58 | } 59 | } 60 | css_ColorMatrix = mat4(c.r, 0.0, 0.0, 0.0, 61 | 0.0, c.g, 0.0, 0.0, 62 | 0.0, 0.0, c.b, 0.0, 63 | 0.0, 0.0, 0.0, c.a); 64 | } 65 | -------------------------------------------------------------------------------- /plugin/notes-server/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var fs = require('fs'); 3 | var io = require('socket.io'); 4 | var _ = require('underscore'); 5 | var Mustache = require('mustache'); 6 | 7 | var app = express.createServer(); 8 | var staticDir = express.static; 9 | 10 | io = io.listen(app); 11 | 12 | var opts = { 13 | port : 1947, 14 | baseDir : __dirname + '/../../' 15 | }; 16 | 17 | io.sockets.on('connection', function(socket) { 18 | socket.on('slidechanged', function(slideData) { 19 | socket.broadcast.emit('slidedata', slideData); 20 | }); 21 | socket.on('fragmentchanged', function(fragmentData) { 22 | socket.broadcast.emit('fragmentdata', fragmentData); 23 | }); 24 | }); 25 | 26 | app.configure(function() { 27 | [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) { 28 | app.use('/' + dir, staticDir(opts.baseDir + dir)); 29 | }); 30 | }); 31 | 32 | app.get("/", function(req, res) { 33 | fs.createReadStream(opts.baseDir + '/index.html').pipe(res); 34 | }); 35 | 36 | app.get("/notes/:socketId", function(req, res) { 37 | 38 | fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) { 39 | res.send(Mustache.to_html(data.toString(), { 40 | socketId : req.params.socketId 41 | })); 42 | }); 43 | // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res); 44 | }); 45 | 46 | // Actually listen 47 | app.listen(opts.port || null); 48 | 49 | var brown = '\033[33m', 50 | green = '\033[32m', 51 | reset = '\033[0m'; 52 | 53 | var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' ); 54 | 55 | console.log( brown + "reveal.js - Speaker Notes" + reset ); 56 | console.log( "1. Open the slides at " + green + slidesLocation + reset ); 57 | console.log( "2. Click on the link your JS console to go to the notes page" ); 58 | console.log( "3. Advance through your slides and your notes will advance automatically" ); 59 | -------------------------------------------------------------------------------- /examples/arduino/6-melodie.ino: -------------------------------------------------------------------------------- 1 | /* Melody 2 | * (cleft) 2005 D. Cuartielles for K3 3 | * 4 | * This example uses a piezo speaker to play melodies. It sends 5 | * a square wave of the appropriate frequency to the piezo, generating 6 | * the corresponding tone. 7 | * 8 | * The calculation of the tones is made following the mathematical 9 | * operation: 10 | * 11 | * timeHigh = period / 2 = 1 / (2 * toneFrequency) 12 | * 13 | * where the different tones are described as in the table: 14 | * 15 | * note frequency period timeHigh 16 | * c 261 Hz 3830 1915 17 | * d 294 Hz 3400 1700 18 | * e 329 Hz 3038 1519 19 | * f 349 Hz 2864 1432 20 | * g 392 Hz 2550 1275 21 | * a 440 Hz 2272 1136 22 | * b 493 Hz 2028 1014 23 | * C 523 Hz 1912 956 24 | * 25 | * http://www.arduino.cc/en/Tutorial/Melody 26 | */ 27 | 28 | int ledPin1 = 13; 29 | int speakerPin = 9; 30 | 31 | int length = 31; // the number of notes 32 | char notes[] = "cffgfedddggagfeeeaabagffccdgef "; // a space represents a rest 33 | int beats[] = { 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 4, 4 }; 34 | int tempo = 120; 35 | 36 | void playTone(int tone, int duration) { 37 | digitalWrite(ledPin1, HIGH); 38 | for (long i = 0; i < duration * 1000L; i += tone * 2) { 39 | digitalWrite(speakerPin, HIGH); 40 | delayMicroseconds(tone); 41 | digitalWrite(speakerPin, LOW); 42 | delayMicroseconds(tone); 43 | } 44 | digitalWrite(ledPin1, LOW); 45 | } 46 | 47 | void playNote(char note, int duration) { 48 | char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; 49 | int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, (1136 + 1014)/2, 956 }; 50 | 51 | // play the tone corresponding to the note name 52 | for (int i = 0; i < 8; i++) { 53 | if (names[i] == note) { 54 | playTone(tones[i]/1.5, duration); 55 | } 56 | } 57 | } 58 | 59 | void setup() { 60 | pinMode(ledPin1, OUTPUT); 61 | pinMode(speakerPin, OUTPUT); 62 | } 63 | 64 | void loop() { 65 | for (int i = 0; i < length; i++) { 66 | if (notes[i] == ' ') { 67 | delay(beats[i] * tempo); // rest 68 | } else { 69 | playNote(notes[i], beats[i] * tempo); 70 | } 71 | 72 | // pause between notes 73 | delay(tempo / 2); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /lib/css/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | pre code { 9 | display: block; padding: 0.5em; 10 | background: #3F3F3F; 11 | color: #DCDCDC; 12 | } 13 | 14 | pre .keyword, 15 | pre .tag, 16 | pre .django .tag, 17 | pre .django .keyword, 18 | pre .css .class, 19 | pre .css .id, 20 | pre .lisp .title { 21 | color: #E3CEAB; 22 | } 23 | 24 | pre .django .template_tag, 25 | pre .django .variable, 26 | pre .django .filter .argument { 27 | color: #DCDCDC; 28 | } 29 | 30 | pre .number, 31 | pre .date { 32 | color: #8CD0D3; 33 | } 34 | 35 | pre .dos .envvar, 36 | pre .dos .stream, 37 | pre .variable, 38 | pre .apache .sqbracket { 39 | color: #EFDCBC; 40 | } 41 | 42 | pre .dos .flow, 43 | pre .diff .change, 44 | pre .python .exception, 45 | pre .python .built_in, 46 | pre .literal, 47 | pre .tex .special { 48 | color: #EFEFAF; 49 | } 50 | 51 | pre .diff .chunk, 52 | pre .ruby .subst { 53 | color: #8F8F8F; 54 | } 55 | 56 | pre .dos .keyword, 57 | pre .python .decorator, 58 | pre .class .title, 59 | pre .haskell .label, 60 | pre .function .title, 61 | pre .ini .title, 62 | pre .diff .header, 63 | pre .ruby .class .parent, 64 | pre .apache .tag, 65 | pre .nginx .built_in, 66 | pre .tex .command, 67 | pre .input_number { 68 | color: #efef8f; 69 | } 70 | 71 | pre .dos .winutils, 72 | pre .ruby .symbol, 73 | pre .ruby .symbol .string, 74 | pre .ruby .symbol .keyword, 75 | pre .ruby .symbol .keymethods, 76 | pre .ruby .string, 77 | pre .ruby .instancevar { 78 | color: #DCA3A3; 79 | } 80 | 81 | pre .diff .deletion, 82 | pre .string, 83 | pre .tag .value, 84 | pre .preprocessor, 85 | pre .built_in, 86 | pre .sql .aggregate, 87 | pre .javadoc, 88 | pre .smalltalk .class, 89 | pre .smalltalk .localvars, 90 | pre .smalltalk .array, 91 | pre .css .rules .value, 92 | pre .attr_selector, 93 | pre .pseudo, 94 | pre .apache .cbracket, 95 | pre .tex .formula { 96 | color: #CC9393; 97 | } 98 | 99 | pre .shebang, 100 | pre .diff .addition, 101 | pre .comment, 102 | pre .java .annotation, 103 | pre .template_comment, 104 | pre .pi, 105 | pre .doctype { 106 | color: #7F9F7F; 107 | } 108 | 109 | pre .xml .css, 110 | pre .xml .javascript, 111 | pre .xml .vbscript, 112 | pre .tex .formula { 113 | opacity: 0.5; 114 | } 115 | 116 | -------------------------------------------------------------------------------- /plugin/notes/notes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handles opening of and synchronization with the reveal.js 3 | * notes window. 4 | */ 5 | var RevealNotes = (function() { 6 | 7 | function openNotes() { 8 | var notesPopup = window.open( 'plugin/notes/notes.html', 'reveal.js - Notes', 'width=1120,height=850' ); 9 | 10 | // Fires when slide is changed 11 | Reveal.addEventListener( 'slidechanged', function( event ) { 12 | post('slidechanged'); 13 | } ); 14 | 15 | // Fires when a fragment is shown 16 | Reveal.addEventListener( 'fragmentshown', function( event ) { 17 | post('fragmentshown'); 18 | } ); 19 | 20 | // Fires when a fragment is hidden 21 | Reveal.addEventListener( 'fragmenthidden', function( event ) { 22 | post('fragmenthidden'); 23 | } ); 24 | 25 | /** 26 | * Posts the current slide data to the notes window 27 | * 28 | * @param {String} eventType Expecting 'slidechanged', 'fragmentshown' 29 | * or 'fragmenthidden' set in the events above to define the needed 30 | * slideDate. 31 | */ 32 | function post( eventType ) { 33 | var slideElement = Reveal.getCurrentSlide(), 34 | messageData; 35 | 36 | if( eventType === 'slidechanged' ) { 37 | var notes = slideElement.querySelector( 'aside.notes' ), 38 | indexh = Reveal.getIndices().h, 39 | indexv = Reveal.getIndices().v, 40 | nextindexh, 41 | nextindexv; 42 | 43 | if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) { 44 | nextindexh = indexh; 45 | nextindexv = indexv + 1; 46 | } else { 47 | nextindexh = indexh + 1; 48 | nextindexv = 0; 49 | } 50 | 51 | messageData = { 52 | notes : notes ? notes.innerHTML : '', 53 | indexh : indexh, 54 | indexv : indexv, 55 | nextindexh : nextindexh, 56 | nextindexv : nextindexv, 57 | markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false 58 | }; 59 | } 60 | else if( eventType === 'fragmentshown' ) { 61 | messageData = { 62 | fragment : 'next' 63 | }; 64 | } 65 | else if( eventType === 'fragmenthidden' ) { 66 | messageData = { 67 | fragment : 'prev' 68 | }; 69 | } 70 | 71 | notesPopup.postMessage( JSON.stringify( messageData ), '*' ); 72 | } 73 | 74 | // Navigate to the current slide when the notes are loaded 75 | notesPopup.addEventListener( 'load', function( event ) { 76 | post('slidechanged'); 77 | }, false ); 78 | } 79 | 80 | // If the there's a 'notes' query set, open directly 81 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { 82 | openNotes(); 83 | } 84 | 85 | // Open the notes when the 's' key is hit 86 | document.addEventListener( 'keydown', function( event ) { 87 | // Disregard the event if the target is editable or a 88 | // modifier is present 89 | if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; 90 | 91 | if( event.keyCode === 83 ) { 92 | event.preventDefault(); 93 | openNotes(); 94 | } 95 | }, false ); 96 | 97 | return { open: openNotes }; 98 | })(); 99 | -------------------------------------------------------------------------------- /lib/js/head.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | Head JS The only script in your 3 | Copyright Tero Piirainen (tipiirai) 4 | License MIT / http://bit.ly/mit-license 5 | Version 0.96 6 | 7 | http://headjs.com 8 | */(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c 2 | 3 | 4 | 5 | 6 | reveal.js - Slide Notes 7 | 8 | 87 | 88 | 89 | 90 | 91 |
92 | 93 |
94 | 95 |
96 | 97 | UPCOMING: 98 |
99 |
100 | 101 | 102 | 103 | 104 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /plugin/notes/notes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | reveal.js - Slide Notes 7 | 8 | 87 | 88 | 89 | 90 | 91 |
92 | 93 |
94 | 95 |
96 | 97 | UPCOMING: 98 |
99 |
100 | 101 | 102 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /css/shaders/tile-flip.vs: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c)2012 Adobe Systems Incorporated. All rights reserved. 3 | * Copyright (c)2012 Branislav Ulicny 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | precision mediump float; 19 | 20 | // Built-in attributes 21 | 22 | attribute vec4 a_position; 23 | attribute vec2 a_texCoord; 24 | attribute vec3 a_triangleCoord; 25 | 26 | // Built-in uniforms 27 | 28 | uniform mat4 u_projectionMatrix; 29 | uniform vec2 u_meshSize; 30 | uniform vec2 u_textureSize; 31 | 32 | // Uniform passed in from CSS 33 | 34 | uniform mat4 transform; 35 | uniform float amount; 36 | uniform float randomness; 37 | uniform vec3 flipAxis; 38 | 39 | // Varyings 40 | 41 | varying float v_depth; 42 | varying vec2 v_uv; 43 | 44 | // Constants 45 | 46 | const float PI2 = 1.5707963267948966; 47 | 48 | // Create perspective matrix 49 | 50 | mat4 perspectiveMatrix(float p) 51 | { 52 | float perspective = - 1.0 / p; 53 | return mat4( 54 | 1.0, 0.0, 0.0, 0.0, 55 | 0.0, 1.0, 0.0, 0.0, 56 | 0.0, 0.0, 1.0, perspective, 57 | 0.0, 0.0, 0.0, 1.0 58 | ); 59 | } 60 | 61 | // Rotate vector 62 | 63 | vec3 rotateVectorByQuaternion(vec3 v, vec4 q) 64 | { 65 | vec3 dest = vec3(0.0); 66 | 67 | float x = v.x, y = v.y, z = v.z; 68 | float qx = q.x, qy = q.y, qz = q.z, qw = q.w; 69 | 70 | // Calculate quaternion * vector. 71 | 72 | float ix = qw * x + qy * z - qz * y, 73 | iy = qw * y + qz * x - qx * z, 74 | iz = qw * z + qx * y - qy * x, 75 | iw = -qx * x - qy * y - qz * z; 76 | 77 | // Calculate result * inverse quaternion. 78 | 79 | dest.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; 80 | dest.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; 81 | dest.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; 82 | 83 | return dest; 84 | } 85 | 86 | // Convert rotation. 87 | 88 | vec4 axisAngleToQuaternion(vec3 axis, float angle) 89 | { 90 | vec4 dest = vec4(0.0); 91 | 92 | float halfAngle = angle / 2.0; 93 | float s = sin(halfAngle); 94 | 95 | dest.x = axis.x * s; 96 | dest.y = axis.y * s; 97 | dest.z = axis.z * s; 98 | dest.w = cos(halfAngle); 99 | 100 | return dest; 101 | } 102 | 103 | // Random function based on the tile coordinate. 104 | // This will return the same value for all the vertices in the same tile (i.e. two triangles). 105 | 106 | float random(vec2 scale) 107 | { 108 | // Use the fragment position as a different seed per-pixel. 109 | return fract(sin(dot(vec2(a_triangleCoord.x, a_triangleCoord.y), scale)) * 4000.0); 110 | } 111 | 112 | // Main 113 | 114 | void main() 115 | { 116 | // FIXME: We must swap x and y as a workaround for: 117 | // https://bugs.webkit.org/show_bug.cgi?id=96285 118 | vec2 u_meshSize = u_meshSize.yx; 119 | 120 | vec4 pos = a_position; 121 | float aspect = u_textureSize.x / u_textureSize.y; 122 | 123 | float cx = a_triangleCoord.x / u_meshSize.y - 0.5 + 0.5 / u_meshSize.y; 124 | float cy = a_triangleCoord.y / u_meshSize.x - 0.5 + 0.5 / u_meshSize.x; 125 | 126 | vec3 centroid = vec3(cx, cy, 0.0); 127 | float r = random(vec2(10.0, 80.0)); 128 | float rr = mix(0.0, PI2, amount * (1.0 + randomness * r)); 129 | 130 | vec4 rotation = vec4(flipAxis, rr); 131 | vec4 qRotation = axisAngleToQuaternion(normalize(rotation.xyz), rotation.w); 132 | 133 | vec3 newPosition = rotateVectorByQuaternion((pos.xyz - centroid)* vec3(aspect, 1., 1.0), qRotation) * vec3(1.0 / aspect, 1.0, 1.0) + centroid; 134 | pos.xyz = newPosition; 135 | 136 | gl_Position = u_projectionMatrix * transform * pos; 137 | 138 | // Pass varyings to the fragment shader. 139 | v_depth = abs(rr)/ PI2; 140 | v_uv = a_texCoord; 141 | } 142 | -------------------------------------------------------------------------------- /css/print/pdf.css: -------------------------------------------------------------------------------- 1 | /* Default Print Stylesheet Template 2 | by Rob Glazebrook of CSSnewbie.com 3 | Last Updated: June 4, 2008 4 | 5 | Feel free (nay, compelled) to edit, append, and 6 | manipulate this file as you see fit. */ 7 | 8 | 9 | /* SECTION 1: Set default width, margin, float, and 10 | background. This prevents elements from extending 11 | beyond the edge of the printed page, and prevents 12 | unnecessary background images from printing */ 13 | * { 14 | -webkit-print-color-adjust: exact; 15 | } 16 | 17 | body { 18 | font-size: 18pt; 19 | width: auto; 20 | height: auto; 21 | border: 0; 22 | margin: 0 5%; 23 | padding: 0; 24 | float: none !important; 25 | overflow: visible; 26 | background-image: none !important; 27 | } 28 | 29 | html { 30 | width: auto; 31 | height: auto; 32 | overflow: visible; 33 | } 34 | 35 | /* SECTION 2: Remove any elements not needed in print. 36 | This would include navigation, ads, sidebars, etc. */ 37 | .nestedarrow, 38 | .controls, 39 | .reveal .progress, 40 | .reveal.overview, 41 | .fork-reveal, 42 | .share-reveal, 43 | .state-background { 44 | display: none !important; 45 | } 46 | 47 | /* SECTION 3: Set body font face, size, and color. 48 | Consider using a serif font for readability. */ 49 | body, p, td, li, div { 50 | font-size: 18pt; 51 | } 52 | 53 | /* SECTION 4: Set heading font face, sizes, and color. 54 | Diffrentiate your headings from your body text. 55 | Perhaps use a large sans-serif for distinction. */ 56 | h1,h2,h3,h4,h5,h6 { 57 | text-shadow: 0 0 0 #000 !important; 58 | } 59 | 60 | /* SECTION 5: Make hyperlinks more usable. 61 | Ensure links are underlined, and consider appending 62 | the URL to the end of the link for usability. */ 63 | a:link, 64 | a:visited { 65 | font-weight: bold; 66 | text-decoration: underline; 67 | } 68 | 69 | 70 | /* SECTION 6: more reveal.js specific additions by @skypanther */ 71 | ul, ol, div, p { 72 | visibility: visible; 73 | position: static; 74 | width: auto; 75 | height: auto; 76 | display: block; 77 | overflow: visible; 78 | margin: auto; 79 | } 80 | .reveal .slides { 81 | position: static; 82 | width: 100%; 83 | height: auto; 84 | 85 | left: auto; 86 | top: auto; 87 | margin-left: auto; 88 | margin-right: auto; 89 | margin-top: auto; 90 | padding: auto; 91 | 92 | overflow: visible; 93 | display: block; 94 | 95 | text-align: center; 96 | 97 | -webkit-perspective: none; 98 | -moz-perspective: none; 99 | -ms-perspective: none; 100 | perspective: none; 101 | 102 | -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ 103 | -moz-perspective-origin: 50% 50%; 104 | -ms-perspective-origin: 50% 50%; 105 | perspective-origin: 50% 50%; 106 | } 107 | .reveal .slides section { 108 | 109 | page-break-after: always !important; 110 | 111 | visibility: visible !important; 112 | position: static !important; 113 | width: 100% !important; 114 | height: auto !important; 115 | min-height: initial !important; 116 | display: block !important; 117 | overflow: visible !important; 118 | 119 | left: 0 !important; 120 | top: 0 !important; 121 | margin-left: 0px !important; 122 | margin-top: 50px !important; 123 | padding: 20px 0px !important; 124 | 125 | opacity: 1 !important; 126 | 127 | -webkit-transform-style: flat !important; 128 | -moz-transform-style: flat !important; 129 | -ms-transform-style: flat !important; 130 | transform-style: flat !important; 131 | 132 | -webkit-transform: none !important; 133 | -moz-transform: none !important; 134 | -ms-transform: none !important; 135 | transform: none !important; 136 | } 137 | .reveal section.stack { 138 | margin: 0px !important; 139 | padding: 0px !important; 140 | page-break-after: avoid !important; 141 | } 142 | .reveal section .fragment { 143 | opacity: 1 !important; 144 | visibility: visible !important; 145 | 146 | -webkit-transform: none !important; 147 | -moz-transform: none !important; 148 | -ms-transform: none !important; 149 | transform: none !important; 150 | } 151 | .reveal img { 152 | box-shadow: none; 153 | } 154 | .reveal .roll { 155 | overflow: visible; 156 | line-height: 1em; 157 | } 158 | .reveal small a { 159 | font-size: 16pt !important; 160 | } 161 | -------------------------------------------------------------------------------- /css/print/paper.css: -------------------------------------------------------------------------------- 1 | /* Default Print Stylesheet Template 2 | by Rob Glazebrook of CSSnewbie.com 3 | Last Updated: June 4, 2008 4 | 5 | Feel free (nay, compelled) to edit, append, and 6 | manipulate this file as you see fit. */ 7 | 8 | 9 | /* SECTION 1: Set default width, margin, float, and 10 | background. This prevents elements from extending 11 | beyond the edge of the printed page, and prevents 12 | unnecessary background images from printing */ 13 | body { 14 | background: #fff; 15 | font-size: 13pt; 16 | width: auto; 17 | height: auto; 18 | border: 0; 19 | margin: 0 5%; 20 | padding: 0; 21 | float: none !important; 22 | overflow: visible; 23 | } 24 | html { 25 | background: #fff; 26 | width: auto; 27 | height: auto; 28 | overflow: visible; 29 | } 30 | 31 | /* SECTION 2: Remove any elements not needed in print. 32 | This would include navigation, ads, sidebars, etc. */ 33 | .nestedarrow, 34 | .controls, 35 | .reveal .progress, 36 | .reveal.overview, 37 | .fork-reveal, 38 | .share-reveal, 39 | .state-background { 40 | display: none !important; 41 | } 42 | 43 | /* SECTION 3: Set body font face, size, and color. 44 | Consider using a serif font for readability. */ 45 | body, p, td, li, div, a { 46 | font-size: 16pt!important; 47 | font-family: Georgia, "Times New Roman", Times, serif !important; 48 | color: #000; 49 | } 50 | 51 | /* SECTION 4: Set heading font face, sizes, and color. 52 | Diffrentiate your headings from your body text. 53 | Perhaps use a large sans-serif for distinction. */ 54 | h1,h2,h3,h4,h5,h6 { 55 | color: #000!important; 56 | height: auto; 57 | line-height: normal; 58 | font-family: Georgia, "Times New Roman", Times, serif !important; 59 | text-shadow: 0 0 0 #000 !important; 60 | text-align: left; 61 | letter-spacing: normal; 62 | } 63 | /* Need to reduce the size of the fonts for printing */ 64 | h1 { font-size: 26pt !important; } 65 | h2 { font-size: 22pt !important; } 66 | h3 { font-size: 20pt !important; } 67 | h4 { font-size: 20pt !important; font-variant: small-caps; } 68 | h5 { font-size: 19pt !important; } 69 | h6 { font-size: 18pt !important; font-style: italic; } 70 | 71 | /* SECTION 5: Make hyperlinks more usable. 72 | Ensure links are underlined, and consider appending 73 | the URL to the end of the link for usability. */ 74 | a:link, 75 | a:visited { 76 | color: #000 !important; 77 | font-weight: bold; 78 | text-decoration: underline; 79 | } 80 | /* 81 | .reveal a:link:after, 82 | .reveal a:visited:after { 83 | content: " (" attr(href) ") "; 84 | color: #222 !important; 85 | font-size: 90%; 86 | } 87 | */ 88 | 89 | 90 | /* SECTION 6: more reveal.js specific additions by @skypanther */ 91 | ul, ol, div, p { 92 | visibility: visible; 93 | position: static; 94 | width: auto; 95 | height: auto; 96 | display: block; 97 | overflow: visible; 98 | margin: auto; 99 | text-align: left !important; 100 | } 101 | .reveal .slides { 102 | position: static; 103 | width: auto; 104 | height: auto; 105 | 106 | left: auto; 107 | top: auto; 108 | margin-left: auto; 109 | margin-top: auto; 110 | padding: auto; 111 | 112 | overflow: visible; 113 | display: block; 114 | 115 | text-align: center; 116 | -webkit-perspective: none; 117 | -moz-perspective: none; 118 | -ms-perspective: none; 119 | perspective: none; 120 | 121 | -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ 122 | -moz-perspective-origin: 50% 50%; 123 | -ms-perspective-origin: 50% 50%; 124 | perspective-origin: 50% 50%; 125 | } 126 | .reveal .slides>section, 127 | .reveal .slides>section>section { 128 | 129 | visibility: visible !important; 130 | position: static !important; 131 | width: 90% !important; 132 | height: auto !important; 133 | display: block !important; 134 | overflow: visible !important; 135 | 136 | left: 0% !important; 137 | top: 0% !important; 138 | margin-left: 0px !important; 139 | margin-top: 0px !important; 140 | padding: 20px 0px !important; 141 | 142 | opacity: 1 !important; 143 | 144 | -webkit-transform-style: flat !important; 145 | -moz-transform-style: flat !important; 146 | -ms-transform-style: flat !important; 147 | transform-style: flat !important; 148 | 149 | -webkit-transform: none !important; 150 | -moz-transform: none !important; 151 | -ms-transform: none !important; 152 | transform: none !important; 153 | } 154 | .reveal section { 155 | page-break-after: always !important; 156 | display: block !important; 157 | } 158 | .reveal section .fragment { 159 | opacity: 1 !important; 160 | visibility: visible !important; 161 | 162 | -webkit-transform: none !important; 163 | -moz-transform: none !important; 164 | -ms-transform: none !important; 165 | transform: none !important; 166 | } 167 | .reveal section:last-of-type { 168 | page-break-after: avoid !important; 169 | } 170 | .reveal section img { 171 | display: block; 172 | margin: 15px 0px; 173 | background: rgba(255,255,255,1); 174 | border: 1px solid #666; 175 | box-shadow: none; 176 | } -------------------------------------------------------------------------------- /css/theme/cccs.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); 3 | @import url('http://fonts.googleapis.com/css?family=Titillium+Web:200'); 4 | /** 5 | * CCCS theme for reveal.js. 6 | * 7 | */ 8 | /********************************************* 9 | * GLOBAL STYLES 10 | *********************************************/ 11 | body { 12 | background: #bebebe; 13 | background: -moz-radial-gradient(center, circle cover, #f0f0f0 0%, #bebebe 100%); 14 | background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f0f0f0), color-stop(100%, #bebebe)); 15 | background: -webkit-radial-gradient(center, circle cover, #f0f0f0 0%, #bebebe 100%); 16 | background: -o-radial-gradient(center, circle cover, #f0f0f0 0%, #bebebe 100%); 17 | background: -ms-radial-gradient(center, circle cover, #f0f0f0 0%, #bebebe 100%); 18 | background: radial-gradient(center, circle cover, #f0f0f0 0%, #bebebe 100%); 19 | background-color: #2b2b2b; 20 | } 21 | 22 | .reveal { 23 | font-family: "Open Sans", sans-serif; 24 | font-size: 30px; 25 | font-weight: 200; 26 | letter-spacing: -0.02em; 27 | color: #666666; 28 | } 29 | 30 | ::selection { 31 | color: white; 32 | background: #134674; 33 | text-shadow: none; 34 | } 35 | 36 | /********************************************* 37 | * HEADERS 38 | *********************************************/ 39 | .reveal h1, 40 | .reveal h2, 41 | .reveal h3, 42 | .reveal h4, 43 | .reveal h5, 44 | .reveal h6 { 45 | margin: 0 0 20px 0; 46 | color: #5bc72b; 47 | font-family: "Titillium Web", sans-serif; 48 | line-height: 36px; 49 | letter-spacing: -1px; 50 | text-transform: none; 51 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); 52 | } 53 | 54 | .reveal h1 { 55 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); 56 | } 57 | 58 | /********************************************* 59 | * LINKS 60 | *********************************************/ 61 | .reveal a:not(.image) { 62 | color: #061e35; 63 | text-decoration: none; 64 | -webkit-transition: color .15s ease; 65 | -moz-transition: color .15s ease; 66 | -ms-transition: color .15s ease; 67 | -o-transition: color .15s ease; 68 | transition: color .15s ease; 69 | } 70 | 71 | .reveal a:not(.image):hover { 72 | color: #105291; 73 | text-shadow: none; 74 | border: none; 75 | } 76 | 77 | .reveal .roll span:after { 78 | color: #fff; 79 | background: black; 80 | } 81 | 82 | /********************************************* 83 | * IMAGES 84 | *********************************************/ 85 | .reveal section img { 86 | margin: 15px 0px; 87 | background: rgba(255, 255, 255, 0.12); 88 | border: 4px solid #666666; 89 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); 90 | -webkit-transition: all .2s linear; 91 | -moz-transition: all .2s linear; 92 | -ms-transition: all .2s linear; 93 | -o-transition: all .2s linear; 94 | transition: all .2s linear; 95 | } 96 | 97 | .reveal a:hover img { 98 | background: rgba(255, 255, 255, 0.2); 99 | border-color: #061e35; 100 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); 101 | } 102 | 103 | /********************************************* 104 | * NAVIGATION CONTROLS 105 | *********************************************/ 106 | .reveal .controls div.navigate-left, 107 | .reveal .controls div.navigate-left.enabled { 108 | border-right-color: #061e35; 109 | } 110 | 111 | .reveal .controls div.navigate-right, 112 | .reveal .controls div.navigate-right.enabled { 113 | border-left-color: #061e35; 114 | } 115 | 116 | .reveal .controls div.navigate-up, 117 | .reveal .controls div.navigate-up.enabled { 118 | border-bottom-color: #061e35; 119 | } 120 | 121 | .reveal .controls div.navigate-down, 122 | .reveal .controls div.navigate-down.enabled { 123 | border-top-color: #061e35; 124 | } 125 | 126 | .reveal .controls div.navigate-left.enabled:hover { 127 | border-right-color: #105291; 128 | } 129 | 130 | .reveal .controls div.navigate-right.enabled:hover { 131 | border-left-color: #105291; 132 | } 133 | 134 | .reveal .controls div.navigate-up.enabled:hover { 135 | border-bottom-color: #105291; 136 | } 137 | 138 | .reveal .controls div.navigate-down.enabled:hover { 139 | border-top-color: #105291; 140 | } 141 | 142 | /********************************************* 143 | * PROGRESS BAR 144 | *********************************************/ 145 | .reveal .progress { 146 | background: rgba(0, 0, 0, 0.2); 147 | } 148 | 149 | .reveal .progress span { 150 | background: #061e35; 151 | -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 152 | -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 153 | -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 154 | -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 155 | transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 156 | } 157 | 158 | .reveal { 159 | letter-spacing: -1px; 160 | line-height: 36px; 161 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); 162 | } 163 | .reveal .slides section { 164 | height: 675px; 165 | width: 900px; 166 | } 167 | .reveal section img { 168 | border: 0; 169 | box-shadow: none; 170 | } 171 | .reveal .frame { 172 | border: 2px solid #666666; 173 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); 174 | } 175 | .reveal .float-right { 176 | float: right; 177 | } 178 | .reveal .float-left { 179 | float: left; 180 | } 181 | .reveal h1 { 182 | font-size: 60px; 183 | line-height: 60px; 184 | padding: 0; 185 | margin: 0; 186 | margin-top: 200px; 187 | padding-right: 40px; 188 | font-weight: 600; 189 | letter-spacing: -3px; 190 | } 191 | .reveal h2 { 192 | font-size: 45px; 193 | line-height: 45px; 194 | padding: 0; 195 | margin: 0; 196 | padding-right: 40px; 197 | padding-bottom: 30px; 198 | font-weight: 600; 199 | letter-spacing: -2px; 200 | } 201 | .reveal h3 { 202 | font-size: 30px; 203 | line-height: 36px; 204 | padding: 0; 205 | margin: 0; 206 | padding-right: 40px; 207 | padding-bottom: 15px; 208 | font-weight: 600; 209 | letter-spacing: -1px; 210 | } 211 | .reveal p { 212 | margin: 0 0 20px 0; 213 | } 214 | .reveal li { 215 | padding: 0; 216 | margin: 0 0 0.4em; 217 | } 218 | .reveal ul li { 219 | list-style: none outside none; 220 | } 221 | .reveal ul li:before { 222 | color: #5bc72b; 223 | content: "·"; 224 | margin-left: -0.75em; 225 | width: 0.75em; 226 | margin-right: 0.5em; 227 | } 228 | .reveal .slides { 229 | text-align: left; 230 | } 231 | .reveal .slides section:not(.stack).present { 232 | border-radius: 10px; 233 | -moz-border-radius: 10px; 234 | border: 1px solid rgba(0, 0, 0, 0.3); 235 | box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); 236 | background-color: white; 237 | } 238 | .reveal .slides div.normal { 239 | padding: 20px 60px 32px; 240 | } 241 | .reveal .slides div.title { 242 | padding: 20px 60px; 243 | } 244 | .reveal .slides div.title > img.header { 245 | position: absolute; 246 | left: 0; 247 | top: 20%; 248 | height: 50%; 249 | width: 100%; 250 | min-height: 50%; 251 | min-width: 100%; 252 | margin: 0; 253 | z-index: -1; 254 | } 255 | .reveal .slides div.title .belowheader { 256 | position: absolute; 257 | top: 70%; 258 | padding-top: 1ex; 259 | } 260 | .reveal .slides div.title .belowheader h1 { 261 | margin: 0; 262 | } 263 | .reveal .slides div.fill { 264 | padding: 20px 60px 32px; 265 | } 266 | .reveal .slides div.fill h2 { 267 | background: rgba(255, 255, 255, 0.75); 268 | padding-top: .2em; 269 | padding-bottom: .3em; 270 | margin-top: .3em; 271 | margin-bottom: .3em; 272 | margin-left: -60px; 273 | padding-left: 60px; 274 | margin-right: -60px; 275 | padding-right: 60px; 276 | } 277 | .reveal .slides div.fill > img { 278 | margin: 0; 279 | border: 0; 280 | border-radius: 10px; 281 | -moz-border-radius: 10px; 282 | position: absolute; 283 | left: 0; 284 | top: 0; 285 | min-height: 100%; 286 | min-width: 100%; 287 | z-index: -1; 288 | } 289 | 290 | .reveal .slides .darkbg { 291 | color: white; 292 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); 293 | } 294 | .reveal .slides .darkbg a { 295 | color: white; 296 | background: rgba(255, 255, 255, 0.2); 297 | } 298 | .reveal .slides .darkbg a:hover { 299 | color: #105291; 300 | background: rgba(255, 255, 255, 0.7); 301 | } 302 | -------------------------------------------------------------------------------- /plugin/zoom-js/zoom.js: -------------------------------------------------------------------------------- 1 | // Custom reveal.js integration 2 | (function(){ 3 | document.querySelector( '.reveal' ).addEventListener( 'click', function( event ) { 4 | if( event.altKey ) { 5 | event.preventDefault(); 6 | zoom.to({ element: event.target, pan: false }); 7 | } 8 | } ); 9 | })(); 10 | 11 | /*! 12 | * zoom.js 0.2 (modified version for use with reveal.js) 13 | * http://lab.hakim.se/zoom-js 14 | * MIT licensed 15 | * 16 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 17 | */ 18 | var zoom = (function(){ 19 | 20 | // The current zoom level (scale) 21 | var level = 1; 22 | 23 | // The current mouse position, used for panning 24 | var mouseX = 0, 25 | mouseY = 0; 26 | 27 | // Timeout before pan is activated 28 | var panEngageTimeout = -1, 29 | panUpdateInterval = -1; 30 | 31 | var currentOptions = null; 32 | 33 | // Check for transform support so that we can fallback otherwise 34 | var supportsTransforms = 'WebkitTransform' in document.body.style || 35 | 'MozTransform' in document.body.style || 36 | 'msTransform' in document.body.style || 37 | 'OTransform' in document.body.style || 38 | 'transform' in document.body.style; 39 | 40 | if( supportsTransforms ) { 41 | // The easing that will be applied when we zoom in/out 42 | document.body.style.transition = 'transform 0.8s ease'; 43 | document.body.style.OTransition = '-o-transform 0.8s ease'; 44 | document.body.style.msTransition = '-ms-transform 0.8s ease'; 45 | document.body.style.MozTransition = '-moz-transform 0.8s ease'; 46 | document.body.style.WebkitTransition = '-webkit-transform 0.8s ease'; 47 | } 48 | 49 | // Zoom out if the user hits escape 50 | document.addEventListener( 'keyup', function( event ) { 51 | if( level !== 1 && event.keyCode === 27 ) { 52 | zoom.out(); 53 | } 54 | }, false ); 55 | 56 | // Monitor mouse movement for panning 57 | document.addEventListener( 'mousemove', function( event ) { 58 | if( level !== 1 ) { 59 | mouseX = event.clientX; 60 | mouseY = event.clientY; 61 | } 62 | }, false ); 63 | 64 | /** 65 | * Applies the CSS required to zoom in, prioritizes use of CSS3 66 | * transforms but falls back on zoom for IE. 67 | * 68 | * @param {Number} pageOffsetX 69 | * @param {Number} pageOffsetY 70 | * @param {Number} elementOffsetX 71 | * @param {Number} elementOffsetY 72 | * @param {Number} scale 73 | */ 74 | function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) { 75 | 76 | if( supportsTransforms ) { 77 | var origin = pageOffsetX +'px '+ pageOffsetY +'px', 78 | transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')'; 79 | 80 | document.body.style.transformOrigin = origin; 81 | document.body.style.OTransformOrigin = origin; 82 | document.body.style.msTransformOrigin = origin; 83 | document.body.style.MozTransformOrigin = origin; 84 | document.body.style.WebkitTransformOrigin = origin; 85 | 86 | document.body.style.transform = transform; 87 | document.body.style.OTransform = transform; 88 | document.body.style.msTransform = transform; 89 | document.body.style.MozTransform = transform; 90 | document.body.style.WebkitTransform = transform; 91 | } 92 | else { 93 | // Reset all values 94 | if( scale === 1 ) { 95 | document.body.style.position = ''; 96 | document.body.style.left = ''; 97 | document.body.style.top = ''; 98 | document.body.style.width = ''; 99 | document.body.style.height = ''; 100 | document.body.style.zoom = ''; 101 | } 102 | // Apply scale 103 | else { 104 | document.body.style.position = 'relative'; 105 | document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px'; 106 | document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px'; 107 | document.body.style.width = ( scale * 100 ) + '%'; 108 | document.body.style.height = ( scale * 100 ) + '%'; 109 | document.body.style.zoom = scale; 110 | } 111 | } 112 | 113 | level = scale; 114 | 115 | if( level !== 1 && document.documentElement.classList ) { 116 | document.documentElement.classList.add( 'zoomed' ); 117 | } 118 | else { 119 | document.documentElement.classList.remove( 'zoomed' ); 120 | } 121 | } 122 | 123 | /** 124 | * Pan the document when the mosue cursor approaches the edges 125 | * of the window. 126 | */ 127 | function pan() { 128 | var range = 0.12, 129 | rangeX = window.innerWidth * range, 130 | rangeY = window.innerHeight * range, 131 | scrollOffset = getScrollOffset(); 132 | 133 | // Up 134 | if( mouseY < rangeY ) { 135 | window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) ); 136 | } 137 | // Down 138 | else if( mouseY > window.innerHeight - rangeY ) { 139 | window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) ); 140 | } 141 | 142 | // Left 143 | if( mouseX < rangeX ) { 144 | window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y ); 145 | } 146 | // Right 147 | else if( mouseX > window.innerWidth - rangeX ) { 148 | window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y ); 149 | } 150 | } 151 | 152 | function getScrollOffset() { 153 | return { 154 | x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset, 155 | y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset 156 | } 157 | } 158 | 159 | return { 160 | /** 161 | * Zooms in on either a rectangle or HTML element. 162 | * 163 | * @param {Object} options 164 | * - element: HTML element to zoom in on 165 | * OR 166 | * - x/y: coordinates in non-transformed space to zoom in on 167 | * - width/height: the portion of the screen to zoom in on 168 | * - scale: can be used instead of width/height to explicitly set scale 169 | */ 170 | to: function( options ) { 171 | // Due to an implementation limitation we can't zoom in 172 | // to another element without zooming out first 173 | if( level !== 1 ) { 174 | zoom.out(); 175 | } 176 | else { 177 | options.x = options.x || 0; 178 | options.y = options.y || 0; 179 | 180 | // If an element is set, that takes precedence 181 | if( !!options.element ) { 182 | // Space around the zoomed in element to leave on screen 183 | var padding = 20; 184 | 185 | options.width = options.element.getBoundingClientRect().width + ( padding * 2 ); 186 | options.height = options.element.getBoundingClientRect().height + ( padding * 2 ); 187 | options.x = options.element.getBoundingClientRect().left - padding; 188 | options.y = options.element.getBoundingClientRect().top - padding; 189 | } 190 | 191 | // If width/height values are set, calculate scale from those values 192 | if( options.width !== undefined && options.height !== undefined ) { 193 | options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); 194 | } 195 | 196 | if( options.scale > 1 ) { 197 | options.x *= options.scale; 198 | options.y *= options.scale; 199 | 200 | var scrollOffset = getScrollOffset(); 201 | 202 | if( options.element ) { 203 | scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2; 204 | } 205 | 206 | magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale ); 207 | 208 | if( options.pan !== false ) { 209 | 210 | // Wait with engaging panning as it may conflict with the 211 | // zoom transition 212 | panEngageTimeout = setTimeout( function() { 213 | panUpdateInterval = setInterval( pan, 1000 / 60 ); 214 | }, 800 ); 215 | 216 | } 217 | } 218 | 219 | currentOptions = options; 220 | } 221 | }, 222 | 223 | /** 224 | * Resets the document zoom state to its default. 225 | */ 226 | out: function() { 227 | clearTimeout( panEngageTimeout ); 228 | clearInterval( panUpdateInterval ); 229 | 230 | var scrollOffset = getScrollOffset(); 231 | 232 | if( currentOptions && currentOptions.element ) { 233 | scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2; 234 | } 235 | 236 | magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 ); 237 | 238 | level = 1; 239 | }, 240 | 241 | // Alias 242 | magnify: function( options ) { this.to( options ) }, 243 | reset: function() { this.out() }, 244 | 245 | zoomLevel: function() { 246 | return level; 247 | } 248 | } 249 | 250 | })(); 251 | 252 | -------------------------------------------------------------------------------- /plugin/markdown/showdown.js: -------------------------------------------------------------------------------- 1 | // 2 | // showdown.js -- A javascript port of Markdown. 3 | // 4 | // Copyright (c) 2007 John Fraser. 5 | // 6 | // Original Markdown Copyright (c) 2004-2005 John Gruber 7 | // 8 | // 9 | // Redistributable under a BSD-style open source license. 10 | // See license.txt for more information. 11 | // 12 | // The full source distribution is at: 13 | // 14 | // A A L 15 | // T C A 16 | // T K B 17 | // 18 | // 19 | // 20 | // 21 | // Wherever possible, Showdown is a straight, line-by-line port 22 | // of the Perl version of Markdown. 23 | // 24 | // This is not a normal parser design; it's basically just a 25 | // series of string substitutions. It's hard to read and 26 | // maintain this way, but keeping Showdown close to the original 27 | // design makes it easier to port new features. 28 | // 29 | // More importantly, Showdown behaves like markdown.pl in most 30 | // edge cases. So web applications can do client-side preview 31 | // in Javascript, and then build identical HTML on the server. 32 | // 33 | // This port needs the new RegExp functionality of ECMA 262, 34 | // 3rd Edition (i.e. Javascript 1.5). Most modern web browsers 35 | // should do fine. Even with the new regular expression features, 36 | // We do a lot of work to emulate Perl's regex functionality. 37 | // The tricky changes in this file mostly have the "attacklab:" 38 | // label. Major or self-explanatory changes don't. 39 | // 40 | // Smart diff tools like Araxis Merge will be able to match up 41 | // this file with markdown.pl in a useful way. A little tweaking 42 | // helps: in a copy of markdown.pl, replace "#" with "//" and 43 | // replace "$text" with "text". Be sure to ignore whitespace 44 | // and line endings. 45 | // 46 | // 47 | // Showdown usage: 48 | // 49 | // var text = "Markdown *rocks*."; 50 | // 51 | // var converter = new Showdown.converter(); 52 | // var html = converter.makeHtml(text); 53 | // 54 | // alert(html); 55 | // 56 | // Note: move the sample code to the bottom of this 57 | // file before uncommenting it. 58 | // 59 | // 60 | // Showdown namespace 61 | // 62 | var Showdown={};Showdown.converter=function(){var a,b,c,d=0;this.makeHtml=function(d){return a=new Array,b=new Array,c=new Array,d=d.replace(/~/g,"~T"),d=d.replace(/\$/g,"~D"),d=d.replace(/\r\n/g,"\n"),d=d.replace(/\r/g,"\n"),d="\n\n"+d+"\n\n",d=F(d),d=d.replace(/^[ \t]+$/mg,""),d=f(d),d=e(d),d=h(d),d=D(d),d=d.replace(/~D/g,"$$"),d=d.replace(/~T/g,"~"),d};var e=function(c){var c=c.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,function(c,d,e,f,g){return d=d.toLowerCase(),a[d]=z(e),f?f+g:(g&&(b[d]=g.replace(/"/g,""")),"")});return c},f=function(a){a=a.replace(/\n/g,"\n\n");var b="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del",c="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math";return a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,g),a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,g),a=a.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,g),a=a.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,g),a=a.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,g),a=a.replace(/\n\n/g,"\n"),a},g=function(a,b){var d=b;return d=d.replace(/\n\n/g,"\n"),d=d.replace(/^\n/,""),d=d.replace(/\n+$/g,""),d="\n\n~K"+(c.push(d)-1)+"K\n\n",d},h=function(a){a=o(a);var b=t("
");return a=a.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,b),a=q(a),a=s(a),a=r(a),a=x(a),a=f(a),a=y(a),a},i=function(a){return a=u(a),a=j(a),a=A(a),a=m(a),a=k(a),a=B(a),a=z(a),a=w(a),a=a.replace(/ +\n/g,"
\n"),a},j=function(a){var b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi;return a=a.replace(b,function(a){var b=a.replace(/(.)<\/?code>(?=.)/g,"$1`");return b=G(b,"\\`*_"),b}),a},k=function(a){return a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,l),a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,l),a=a.replace(/(\[([^\[\]]+)\])()()()()()/g,l),a},l=function(c,d,e,f,g,h,i,j){j==undefined&&(j="");var k=d,l=e,m=f.toLowerCase(),n=g,o=j;if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(a[m]!=undefined)n=a[m],b[m]!=undefined&&(o=b[m]);else{if(!(k.search(/\(\s*\)$/m)>-1))return k;n=""}}n=G(n,"*_");var p='",p},m=function(a){return a=a.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,n),a=a.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,n),a},n=function(c,d,e,f,g,h,i,j){var k=d,l=e,m=f.toLowerCase(),n=g,o=j;o||(o="");if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(a[m]==undefined)return k;n=a[m],b[m]!=undefined&&(o=b[m])}l=l.replace(/"/g,"""),n=G(n,"*_");var p=''+l+''+i(c)+"")}),a=a.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(a,c){return t('

'+i(c)+"

")}),a=a.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(a,c,d){var e=c.length;return t("'+i(d)+"")}),a},p,q=function(a){a+="~0";var b=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;return d?a=a.replace(b,function(a,b,c){var d=b,e=c.search(/[*+-]/g)>-1?"ul":"ol";d=d.replace(/\n{2,}/g,"\n\n\n");var f=p(d);return f=f.replace(/\s+$/,""),f="<"+e+">"+f+"\n",f}):(b=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g,a=a.replace(b,function(a,b,c,d){var e=b,f=c,g=d.search(/[*+-]/g)>-1?"ul":"ol",f=f.replace(/\n{2,}/g,"\n\n\n"),h=p(f);return h=e+"<"+g+">\n"+h+"\n",h})),a=a.replace(/~0/,""),a};p=function(a){return d++,a=a.replace(/\n{2,}$/,"\n"),a+="~0",a=a.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(a,b,c,d,e){var f=e,g=b,j=c;return g||f.search(/\n{2,}/)>-1?f=h(E(f)):(f=q(E(f)),f=f.replace(/\n$/,""),f=i(f)),"
  • "+f+"
  • \n"}),a=a.replace(/~0/g,""),d--,a};var r=function(a){return a+="~0",a=a.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(a,b,c){var d=b,e=c;return d=v(E(d)),d=F(d),d=d.replace(/^\n+/g,""),d=d.replace(/\n+$/g,""),d="
    "+d+"\n
    ",t(d)+e}),a=a.replace(/~0/,""),a},s=function(a){return a+="~0",a=a.replace(/\n```(.*)\n([^`]+)\n```/g,function(a,b,c){var d=b,e=c;return e=v(e),e=F(e),e=e.replace(/^\n+/g,""),e=e.replace(/\n+$/g,""),e="
    "+e+"\n
    ",t(e)}),a=a.replace(/~0/,""),a},t=function(a){return a=a.replace(/(^\n+|\n+$)/g,""),"\n\n~K"+(c.push(a)-1)+"K\n\n"},u=function(a){return a=a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(a,b,c,d,e){var f=d;return f=f.replace(/^([ \t]*)/g,""),f=f.replace(/[ \t]*$/g,""),f=v(f),b+""+f+""}),a},v=function(a){return a=a.replace(/&/g,"&"),a=a.replace(//g,">"),a=G(a,"*_{}[]\\",!1),a},w=function(a){return a=a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"),a=a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2"),a},x=function(a){return a=a.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(a,b){var c=b;return c=c.replace(/^[ \t]*>[ \t]?/gm,"~0"),c=c.replace(/~0/g,""),c=c.replace(/^[ \t]+$/gm,""),c=h(c),c=c.replace(/(^|\n)/g,"$1 "),c=c.replace(/(\s*
    [^\r]+?<\/pre>)/gm,function(a,b){var c=b;return c=c.replace(/^  /mg,"~0"),c=c.replace(/~0/g,""),c}),t("
    \n"+c+"\n
    ")}),a},y=function(a){a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,"");var b=a.split(/\n{2,}/g),d=new Array,e=b.length;for(var f=0;f=0?d.push(g):g.search(/\S/)>=0&&(g=i(g),g=g.replace(/^([ \t]*)/g,"

    "),g+="

    ",d.push(g))}e=d.length;for(var f=0;f=0){var h=c[RegExp.$1];h=h.replace(/\$/g,"$$$$"),d[f]=d[f].replace(/~K\d+K/,h)}return d.join("\n\n")},z=function(a){return a=a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"),a=a.replace(/<(?![a-z\/?\$!])/gi,"<"),a},A=function(a){return a=a.replace(/\\(\\)/g,H),a=a.replace(/\\([`*_{}\[\]()>#+-.!])/g,H),a},B=function(a){return a=a.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,'
    $1'),a=a.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(a,b){return C(D(b))}),a},C=function(a){function b(a){var b="0123456789ABCDEF",c=a.charCodeAt(0);return b.charAt(c>>4)+b.charAt(c&15)}var c=[function(a){return"&#"+a.charCodeAt(0)+";"},function(a){return"&#x"+b(a)+";"},function(a){return a}];return a="mailto:"+a,a=a.replace(/./g,function(a){if(a=="@")a=c[Math.floor(Math.random()*2)](a);else if(a!=":"){var b=Math.random();a=b>.9?c[2](a):b>.45?c[1](a):c[0](a)}return a}),a=''+a+"",a=a.replace(/">.+:/g,'">'),a},D=function(a){return a=a.replace(/~E(\d+)E/g,function(a,b){var c=parseInt(b);return String.fromCharCode(c)}),a},E=function(a){return a=a.replace(/^(\t|[ ]{1,4})/gm,"~0"),a=a.replace(/~0/g,""),a},F=function(a){return a=a.replace(/\t(?=\t)/g," "),a=a.replace(/\t/g,"~A~B"),a=a.replace(/~B(.+?)~A/g,function(a,b,c){var d=b,e=4-d.length%4;for(var f=0;f",l.wrapper.appendChild(e)}if(!l.wrapper.querySelector(".controls")&&r.controls){var t=document.createElement("aside");t.classList.add("controls"),t.innerHTML='',l.wrapper.appendChild(t)}if(!l.wrapper.querySelector(".state-background")){var n=document.createElement("div");n.classList.add("state-background"),l.wrapper.appendChild(n)}if(!l.wrapper.querySelector(".pause-overlay")){var i=document.createElement("div");i.classList.add("pause-overlay"),l.wrapper.appendChild(i)}l.progress=document.querySelector(".reveal .progress"),l.progressbar=document.querySelector(".reveal .progress span"),r.controls&&(l.controls=document.querySelector(".reveal .controls"),l.controlsLeft=k(document.querySelectorAll(".navigate-left")),l.controlsRight=k(document.querySelectorAll(".navigate-right")),l.controlsUp=k(document.querySelectorAll(".navigate-up")),l.controlsDown=k(document.querySelectorAll(".navigate-down")),l.controlsPrev=k(document.querySelectorAll(".navigate-prev")),l.controlsNext=k(document.querySelectorAll(".navigate-next")))}function w(){navigator.userAgent.match(/(iphone|ipod)/i)&&(document.documentElement.style.overflow="scroll",document.body.style.height="120%",window.addEventListener("load",M,!1),window.addEventListener("orientationchange",M,!1))}function E(){function o(){t.length&&head.js.apply(null,t),S()}var e=[],t=[];for(var n=0,i=r.dependencies.length;n'+i.innerHTML+"")}}}function P(){if(r.center){var t=k(document.querySelectorAll(e)),n=-l.wrapper.offsetHeight/2;for(var i=0,s=t.length;i3?"none":"block"}n[o].classList.remove("past"),n[o].classList.remove("present"),n[o].classList.remove("future"),ot&&n[o].classList.add("future"),u.querySelector("section")&&n[o].classList.add("stack")}n[t].classList.add("present");var l=n[t].getAttribute("data-state");l&&(f=f.concat(l.split(" ")));var c=n[t].getAttribute("data-autoslide");c?i=parseInt(c,10):i=r.autoSlide}else t=0;return t}function J(){if(r.progress&&l.progress){var n=k(document.querySelectorAll(t)),i=document.querySelectorAll(e+":not(.stack)").length,s=0;e:for(var o=0;o0,right:s0,down:o0||o>0)t+=s;o>0&&(t+="/"+o)}window.location.hash=t}}}function Z(e){var n=s,r=o;if(e){var i=!!e.parentNode.nodeName.match(/section/gi),u=i?e.parentNode:e,a=k(document.querySelectorAll(t));n=Math.max(a.indexOf(u),0),i&&(r=Math.max(k(e.parentNode.children).indexOf(e),0))}return{h:n,v:r}}function et(){if(document.querySelector(n+".present")){var e=document.querySelectorAll(n+".present .fragment:not(.visible)");if(e.length)return e[0].classList.add("visible"),_("fragmentshown",{fragment:e[0]}),!0}else{var r=document.querySelectorAll(t+".present .fragment:not(.visible)");if(r.length)return r[0].classList.add("visible"),_("fragmentshown",{fragment:r[0]}),!0}return!1}function tt(){if(document.querySelector(n+".present")){var e=document.querySelectorAll(n+".present .fragment.visible");if(e.length)return e[e.length-1].classList.remove("visible"),_("fragmenthidden",{fragment:e[e.length-1]}),!0}else{var r=document.querySelectorAll(t+".present .fragment.visible");if(r.length)return r[r.length-1].classList.remove("visible"),_("fragmenthidden",{fragment:r[r.length-1]}),!0}return!1}function nt(){clearTimeout(d),i&&(d=setTimeout(at,i))}function rt(){(Q().left&&q()||tt()===!1)&&V(s-1)}function it(){(Q().right&&q()||et()===!1)&&V(s+1)}function st(){(Q().up&&q()||tt()===!1)&&V(s,o-1)}function ot(){(Q().down&&q()||et()===!1)&&V(s,o+1)}function ut(){if(tt()===!1)if(Q().up)st();else{var e=document.querySelector(t+".past:nth-child("+s+")");e&&(o=e.querySelectorAll("section").length+1||undefined,s--,V())}}function at(){et()===!1&&(Q().down?ot():it()),nt()}function ft(e){var t=document.activeElement,n=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&document.activeElement.contentEditable==="inherit");if(n||e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)return;var r=!0;switch(e.keyCode){case 80:case 33:ut();break;case 78:case 34:at();break;case 72:case 37:rt();break;case 76:case 39:it();break;case 75:case 38:st();break;case 74:case 40:ot();break;case 36:V(0);break;case 35:V(Number.MAX_VALUE);break;case 32:q()?F():at();break;case 13:q()?F():r=!1;break;case 66:case 190:W();break;case 70:R();break;default:r=!1}r?e.preventDefault():e.keyCode===27&&c&&(I(),e.preventDefault()),nt()}function lt(e){g.startX=e.touches[0].clientX,g.startY=e.touches[0].clientY,g.startCount=e.touches.length,e.touches.length===2&&r.overview&&(g.startSpan=A({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:g.startX,y:g.startY}))}function ct(e){if(!g.handled){var t=e.touches[0].clientX,n=e.touches[0].clientY;if(e.touches.length===2&&g.startCount===2&&r.overview){var i=A({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:g.startX,y:g.startY});Math.abs(g.startSpan-i)>g.threshold&&(g.handled=!0,ig.threshold&&Math.abs(s)>Math.abs(o)?(g.handled=!0,rt()):s<-g.threshold&&Math.abs(s)>Math.abs(o)?(g.handled=!0,it()):o>g.threshold?(g.handled=!0,st()):o<-g.threshold&&(g.handled=!0,ot()),e.preventDefault()}}else navigator.userAgent.match(/android/gi)&&e.preventDefault()}function ht(e){g.handled=!1}function pt(e){clearTimeout(p),p=setTimeout(function(){var t=e.detail||-e.wheelDelta;t>0?at():ut()},100)}function dt(e){var n=k(document.querySelectorAll(t)).length,r=Math.floor(e.clientX/l.wrapper.offsetWidth*n);V(r)}function vt(e){G()}function mt(e){P()}function gt(e){if(q()){e.preventDefault(),F();var t=e.target;while(t&&!t.nodeName.match(/section/gi))t=t.parentNode;if(t.nodeName.match(/section/gi)){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);V(n,r)}}}var e=".reveal .slides section",t=".reveal .slides>section",n=".reveal .slides>section.present>section",r={controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,loop:!1,rtl:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!0,theme:null,transition:"default",dependencies:[]},i=r.autoSlide,s=0,o=0,u,a,f=[],l={},c="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,h="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,p=0,d=0,v=0,m=0,g={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:y,slide:V,left:rt,right:it,up:st,down:ot,prev:ut,next:at,prevFragment:tt,nextFragment:et,navigateTo:V,navigateLeft:rt,navigateRight:it,navigateUp:st,navigateDown:ot,navigatePrev:ut,navigateNext:at,toggleOverview:I,addEventListeners:T,removeEventListeners:N,getIndices:Z,getPreviousSlide:function(){return u},getCurrentSlide:function(){return a},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},addEventListener:function(e,t,n){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}(); -------------------------------------------------------------------------------- /plugin/highlight/highlight.js: -------------------------------------------------------------------------------- 1 | // START CUSTOM REVEAL.JS INTEGRATION 2 | [].slice.call( document.querySelectorAll( 'pre code' ) ).forEach( function( element ) { 3 | element.addEventListener( 'focusout', function( event ) { 4 | hljs.highlightBlock( event.currentTarget ); 5 | }, false ); 6 | } ); 7 | // END CUSTOM REVEAL.JS INTEGRATION 8 | 9 | 10 | /* 11 | Syntax highlighting with language autodetection. 12 | http://softwaremaniacs.org/soft/highlight/ 13 | */ 14 | var hljs=new function(){function m(p){return p.replace(/"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("")}while(p!=v.node);t.splice(q,1);while(q'+m(L[0])+""}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"
    ")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.cs={dM:{k:{"abstract":1,as:1,base:1,bool:1,"break":1,"byte":1,"case":1,"catch":1,"char":1,checked:1,"class":1,"const":1,"continue":1,decimal:1,"default":1,delegate:1,"do":1,"do":1,"double":1,"else":1,"enum":1,event:1,explicit:1,extern:1,"false":1,"finally":1,fixed:1,"float":1,"for":1,foreach:1,"goto":1,"if":1,implicit:1,"in":1,"int":1,"interface":1,internal:1,is:1,lock:1,"long":1,namespace:1,"new":1,"null":1,object:1,operator:1,out:1,override:1,params:1,"private":1,"protected":1,"public":1,readonly:1,ref:1,"return":1,sbyte:1,sealed:1,"short":1,sizeof:1,stackalloc:1,"static":1,string:1,struct:1,"switch":1,"this":1,"throw":1,"true":1,"try":1,"typeof":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,"volatile":1,"void":1,"while":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,"var":1,where:1,yield:1},c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},hljs.CLCM,hljs.CBLCLM,{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,"abstract":1,global:1,"private":1,echo:1,"interface":1,as:1,"static":1,endswitch:1,array:1,"null":1,"if":1,endwhile:1,or:1,"const":1,"for":1,endforeach:1,self:1,"var":1,"while":1,isset:1,"public":1,"protected":1,exit:1,foreach:1,"throw":1,elseif:1,"extends":1,include:1,__FILE__:1,empty:1,require_once:1,"function":1,"do":1,xor:1,"return":1,"implements":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,"else":1,"break":1,print:1,"eval":1,"new":1,"catch":1,__METHOD__:1,"class":1,"case":1,exception:1,php_user_filter:1,"default":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,"final":1,"try":1,"this":1,"switch":1,"continue":1,endfor:1,endif:1,declare:1,unset:1,"true":1,"false":1,namespace:1},c:[hljs.CLCM,hljs.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+",r:10}]},hljs.CNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:"variable",b:"\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"}]}};hljs.LANGUAGES.python=function(){var c={cN:"string",b:"(u|b)?r?'''",e:"'''",r:10};var b={cN:"string",b:'(u|b)?r?"""',e:'"""',r:10};var a={cN:"string",b:"(u|r|ur|b|br)'",e:"'",c:[hljs.BE],r:10};var f={cN:"string",b:'(u|r|ur|b|br)"',e:'"',c:[hljs.BE],r:10};var d={cN:"title",b:hljs.UIR};var e={cN:"params",b:"\\(",e:"\\)",c:[c,b,a,f,hljs.ASM,hljs.QSM]};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,"in":1,"if":1,from:1,raise:1,"for":1,except:1,"finally":1,print:1,"import":1,pass:1,"return":1,exec:1,"else":1,"break":1,not:1,"with":1,"class":1,assert:1,yield:1,"try":1,"while":1,"continue":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:"(|\\?)",c:[hljs.HCM,c,b,a,f,hljs.ASM,hljs.QSM,{cN:"function",b:"\\bdef ",e:":",i:"$",k:{def:1},c:[d,e],r:10},{cN:"class",b:"\\bclass ",e:":",i:"[${]",k:{"class":1},c:[d,e],r:10},hljs.CNM,{cN:"decorator",b:"@",e:"$"}]}}}();hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,"do":1,"return":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,"continue":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,"for":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,"goto":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,"int":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,"else":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,"while":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,"delete":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,"package":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,"if":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,"eval":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var d={cN:"subst",b:"[$@]\\{",e:"}",k:c,r:10};var b={cN:"variable",b:"\\$\\d"};var a={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var g=[hljs.BE,d,b,a];var f={b:"->",c:[{b:hljs.IR},{b:"{",e:"}"}]};var e=[b,a,hljs.HCM,{cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5},f,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:g,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:g,r:5},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"string",b:'"',e:'"',c:g,r:0},{cN:"string",b:"`",e:"`",c:[hljs.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[hljs.BE],r:0},{cN:"sub",b:"\\bsub\\b",e:"(\\s*\\(.*?\\))?[;{]",k:{sub:1},r:5},{cN:"operator",b:"-\\w\\b",r:0},{cN:"pod",b:"\\=\\w",e:"\\=cut"}];d.c=e;f.c[1].c=e;return{dM:{k:c,c:e}}}();hljs.LANGUAGES.cpp=function(){var b={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};var a={cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10};a.c=[a];return{dM:{k:b,i:" 2 | 3 | 19 | 21 | 43 | 45 | 46 | 48 | image/svg+xml 49 | 51 | 52 | 53 | 54 | 58 | 60 | 65 | 68 | 71 | 80 | 83 | 86 | 87 | 88 | 91 | 101 | 103 | 106 | 115 | 116 | 121 | 122 | 126 | 130 | 134 | 135 | 139 | 143 | 147 | 148 | 152 | 156 | 160 | 161 | 164 | 173 | 176 | 179 | 182 | 183 | 184 | 187 | 196 | 199 | 200 | 201 | 202 | 203 | -------------------------------------------------------------------------------- /css/reveal.min.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";/*! 2 | * reveal.js 3 | * http://lab.hakim.se/reveal-js 4 | * MIT licensed 5 | * 6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}@media screen and (max-width: 900px),(max-height: 600px){.reveal .slides{ font-size:.82em}}@media screen and (max-width: 700px),(max-height: 400px){.reveal .slides{ font-size:.66em}}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-break:break-all;word-break:break-word}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale( 1.3 );-moz-transform:scale( 1.3 );-ms-transform:scale( 1.3 );-o-transform:scale( 1.3 );transform:scale( 1.3 )}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale( .7 );-moz-transform:scale( .7 );-ms-transform:scale( .7 );-o-transform:scale( .7 );transform:scale( .7 )}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX( 90deg );-moz-transform:rotateX( 90deg );-ms-transform:rotateX( 90deg );-o-transform:rotateX( 90deg );transform:rotateX( 90deg )}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX( 0 );-moz-transform:rotateX( 0 );-ms-transform:rotateX( 0 );-o-transform:rotateX( 0 );transform:rotateX( 0 )}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal img,.reveal iframe{max-width:100%;max-height:100%}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal blockquote:before{content:'\201C'}.reveal blockquote:after{content:'\201D'}.reveal q{font-style:italic}.reveal q:before{content:'\201C'}.reveal q:after{content:'\201D'}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal pre code{padding:5px}.reveal code{font-family:monospace;overflow:auto;max-height:400px}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{text-shadow:#fff 1px 1px 2px}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.1;width:0;height:0;border:12px solid transparent;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-ms-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease}.reveal .controls div.enabled{opacity:.6;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.260,.860,.440,.985);-moz-transition:width 800ms cubic-bezier(0.260,.860,.440,.985);-ms-transition:width 800ms cubic-bezier(0.260,.860,.440,.985);-o-transition:width 800ms cubic-bezier(0.260,.860,.440,.985);transition:width 800ms cubic-bezier(0.260,.860,.440,.985)}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d( 0,0,-45px ) rotateX( 90deg );-moz-transform:translate3d( 0,0,-45px ) rotateX( 90deg );-ms-transform:translate3d( 0,0,-45px ) rotateX( 90deg );transform:translate3d( 0,0,-45px ) rotateX( 90deg )}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d( 0,110%,0 ) rotateX( -90deg );-moz-transform:translate3d( 0,110%,0 ) rotateX( -90deg );-ms-transform:translate3d( 0,110%,0 ) rotateX( -90deg );transform:translate3d( 0,110%,0 ) rotateX( -90deg )}.reveal{position:relative;width:100%;height:100%;min-height:640px}.reveal .slides{position:absolute;max-width:900px;min-height:600px;width:80%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:400;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.260,.860,.440,.985),-webkit-transform 800ms cubic-bezier(0.260,.860,.440,.985),visibility 800ms cubic-bezier(0.260,.860,.440,.985),opacity 800ms cubic-bezier(0.260,.860,.440,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.260,.860,.440,.985),-moz-transform 800ms cubic-bezier(0.260,.860,.440,.985),visibility 800ms cubic-bezier(0.260,.860,.440,.985),opacity 800ms cubic-bezier(0.260,.860,.440,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.260,.860,.440,.985),-ms-transform 800ms cubic-bezier(0.260,.860,.440,.985),visibility 800ms cubic-bezier(0.260,.860,.440,.985),opacity 800ms cubic-bezier(0.260,.860,.440,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.260,.860,.440,.985),-o-transform 800ms cubic-bezier(0.260,.860,.440,.985),visibility 800ms cubic-bezier(0.260,.860,.440,.985),opacity 800ms cubic-bezier(0.260,.860,.440,.985);transition:transform-origin 800ms cubic-bezier(0.260,.860,.440,.985),transform 800ms cubic-bezier(0.260,.860,.440,.985),visibility 800ms cubic-bezier(0.260,.860,.440,.985),opacity 800ms cubic-bezier(0.260,.860,.440,.985)}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:600px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ( -20px );-moz-transform:translateZ( -20px );-ms-transform:translateZ( -20px );-o-transform:translateZ( -20px );transform:translateZ( -20px )}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX( 65deg );-moz-transform:translateZ(-90px) rotateX( 65deg );-ms-transform:translateZ(-90px) rotateX( 65deg );-o-transform:translateZ(-90px) rotateX( 65deg );transform:translateZ(-90px) rotateX( 65deg )}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:600px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ( -20px );-moz-transform:translateZ( -20px );-ms-transform:translateZ( -20px );-o-transform:translateZ( -20px );transform:translateZ( -20px )}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX( 65deg )}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.tileflip .slides section.present{-webkit-transform:none;-webkit-transition-duration:800ms;-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 0,randomness 0,flipAxis 0 1 0,tileOutline 1 )}.reveal.tileflip .slides section.past{-webkit-transform:none;-webkit-transition-duration:800ms;-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 1,randomness 0,flipAxis 0 1 0,tileOutline 1 )}.reveal.tileflip .slides section.future{-webkit-transform:none;-webkit-transition-duration:800ms;-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 1,randomness 0,flipAxis 0 1 0,tileOutline 1 )}.reveal.tileflip .slides>section>section.present{-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 0,randomness 2,flipAxis 1 0 0,tileOutline 1 )}.reveal.tileflip .slides>section>section.past{-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 1,randomness 2,flipAxis 1 0 0,tileOutline 1 )}.reveal.tileflip .slides>section>section.future{-webkit-filter:custom( url(shaders/tile-flip.vs) mix(url(shaders/tile-flip.fs) multiply source-atop),10 10 border-box detached,transform perspective(1000) scale(1) rotateX(0deg) rotateY(0deg) rotateZ(0deg),amount 1,randomness 2,flipAxis 1 0 0,tileOutline 1 )}.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .slides{top:0;left:50%;margin:0;text-align:center}.no-transforms .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;transform:none}.no-transforms .slides section section{left:0}.no-transition{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba( 0,0,0,0 );-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba( 200,50,30,.6 )}.soothe .reveal .state-background{background:rgba( 50,200,90,.4 )}.blackout .reveal .state-background{background:rgba( 0,0,0,.6 )}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Geekige Weihnachtstage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 29 | 30 | 31 | 32 | 33 |
    34 | 35 | 36 |
    37 | 38 |
    39 |
    40 | 41 |
    42 |

    Geekige Weihnachtstage

    43 |

    Was tun außer Plätzchenessen

    44 |
    45 |
    46 |
    47 | 48 |
    49 |
    50 |
    51 |

    L33t H4x0r-Tools (doh!)

    52 | 53 |
    54 |
    55 | 56 |
    57 |
    58 |

    Warning

    59 | 60 |

    Try this at home... only at home

    61 |
    62 |
    63 | 64 |
    65 |
    66 |

    Backtrack - Live CD

    67 | 68 |

    Live-CD mit unglaublichen Mengen an Tools

    69 |

    Laut Wikipedia ist scheinbar 70 | einer der Autoren 71 | Teilhaber der „Finfisher“-Firma 72 | (wäre stimmig mit der Aussage von Heise, 73 | FinFisher würde auf Backtrack beruhen)... you have been warned ;-) 74 |

    75 |
    76 |
    77 | 78 |
    79 |
    80 |

    Eine Menge cooles (neues?) Spielzeug

    81 |

    Metasploit - das „Schweizer Taschenmesser“ des Pentestings

    82 |

    BeEF - warum XSS-Lücken immer schlimm sind

    83 |

    subterfuge - Man-in-the-Middle Point-and-Click

    84 |

    ...

    85 |
    86 |
    87 | 88 |
    89 |
    90 |

    „Opfer“-Systeme

    91 |

    Spätestens hier: Vorsicht, nicht direkt ans Netz hängen :-)

    92 |

    Klassiker: Metasploitable

    93 |

    Vorteil: Hierfür gibt es reichlich Dokumentation und Tutorials

    94 |

    ...oder eine alte Windows-CD

    95 |

    (ok, das ist dann wie kleine Kinder schlagen)
    96 | (ist aber trotzdem lustig) 97 |

    98 |
    99 |
    100 | 101 |
    102 |
    103 |

    Einrichtung von VirtualBox

    104 |

    Kaum jemand hat drei Rechner „übrig“: Virtuelle Maschinen

    105 |

    VMs sollen sich gegenseitig sehen, aber nicht das Internet erreichen

    106 |
      107 |
    • Einrichtung eines Host-Only-Interfaces vboxnet0 (File/Preferences/Network)
    • 108 |
    • Netzwerkeinstellungen aller VMs: Host-Only, Interface vboxnet0
    • 109 |
    • Kommunikation mit Host-System: Interface vboxnet0 manuell konfigurieren
    • 110 |
    111 |
    112 |
    113 | 114 |
    115 |
    116 |

    Metasploit

    117 |

    Umfassendes Pentesting und Exploit Tool

    118 |

    Ursprungsidee: Exploits werden aus Komponenten kombiniert: 119 |

      120 |
    • Der eigentliche Exploit
    • 121 |
    • Payload (was ausgeführt wird)
    • 122 |
    • Obfuscation, IDS prevention, etc.
    • 123 |
    124 |

    125 |

    ...das ganze modular und einfach erweiterbar.

    126 |
    127 |
    128 | 129 |
    130 |
    131 |

    Metasploit

    132 |

    Gewachsen zu einem umfassenden Pentesting-Tool: 133 |

      134 |
    • Verwaltung von Payload-Verbindungen (Meterpreter Shells)
    • 135 |
    • „Tunneln“ von Metasploit durch einen gePWNten Rechner (Pivoting)
    • 136 |
    • Integration diverser Tools (Scanner, Fuzzer)
    • 137 |
    • Protokollierungsmöglichkeiten
    • 138 |
    • Uvm.
    • 139 |
    140 |

    141 |
    142 | 175 |
    176 | 177 |
    178 |
    179 |

    BeEF: Browser Exploitation Framework

    180 |

    Webanwendung: Liefert „Hook“ und Management-Konsole aus

    181 |

    Hook auf fremde Seite „einbauen“ (XSS, modifizierte Webseite, etc.)

    182 |

    Modular aufgebaut, einfach erweiterbar

    183 |

    Skriptbar über REST-API

    184 |
    185 | 200 |
    201 | 202 |
    203 |
    204 |

    Subterfuge

    205 |

    Weboberfläche für diverse SSL-MitM-Tools

    206 |

    Unter der Haube: „Alte Bekannte“ wie SSLStrip, etc.

    207 |

    Wieder Metasploit-Integrationsmöglichkeit ;-)

    208 |
    209 | 212 |
    213 |
    214 | 215 | 216 |
    217 |
    218 |
    219 |

    Sprachen lernen!

    220 | 221 |
    222 |
    223 | 224 |
    225 |
    226 |

    Programmierspiele

    227 |

    Spielend lernen durch Programmierspiele :-)

    228 |

    Idee: Motivation durch konkretes Projekt, Wettstreit mit anderen

    229 |

    Reichlich Auswahl

    230 |

    Klassiker: Core Wars (beschrieben im Scientific American 1984), eigener Assembler-Dialekt

    231 |

    Heute: In verschiedenen Hoch- und Skriptsprachen

    232 |
    233 |
    234 | 235 |
    236 |
    237 |
    238 |
    239 | 240 |
    241 |
    242 |
    243 | 244 |
    245 |
    246 |

    Robocode

    247 |

    Plattformen: JVM, .net

    248 |

    Ziel: Gegnerische Roboter ausschalten

    249 |

    Modi: 1:1, Gruppenkampf, etc. - es gibt laufende Ligen

    250 |

    Roboter = Radar + Fahrwerk + Kanone

    251 |

    Aktionen: 252 |

      253 |
    • Radar/Kanone/Fahrwerk drehen
    • 254 |
    • Vorwärts/rückwärts fahren
    • 255 |
    • Kanone abfeuern
    • 256 |
    257 |

    258 |

    Spielfeld nicht diskret, Limitierungen durch Spielphysik

    259 |
    260 |
    261 | 262 |
    263 |
    264 |

    My first robot

    265 |

    Viel Doku im Robo-Wiki

    266 |

    Für nicht-Java-Sprachen: Entsprechende Libraries zum Classpath von Robowars hinzufügen

    267 |

    Compile-Ergebnis: Directory unter Options/Preferences/Development Options aufnehmen

    268 |
    public class MyFirstRobot extends Robot {
    269 |   @Override
    270 |   public void run() {
    271 |     setAdjustRadarForGunTurn(false);
    272 |     while (true) {
    273 |       turnGunLeft(10.0);
    274 |     }
    275 |   }
    276 | 
    277 |   @Override
    278 |   public void onScannedRobot(ScannedRobotEvent event) {
    279 |     fire(1.0);
    280 |   }
    281 | }
    282 |
    283 |
    284 | 285 |
    286 |
    287 |

    Scalatron

    288 |
    289 | 290 |
    291 |
    292 |
    293 | 294 |
    295 |
    296 |

    Scalatron

    297 |

    Speziell zum Erlernen von Scala

    298 |

    Vorteil: „All in one“, keine separate IDE nötig

    299 |

    Ziel: Möglichst viel Energie sammeln

    300 |

    Bots und Mini-Bots: Steuerbare Entitäten

    301 |
      302 |
    • Bots können Mini-Bots spawnen
    • 303 |
    • Übertragen dabei eine gewisse Energiemenge
    • 304 |
    • Mini-Bots benötigen stetig Energie
    • 305 |
    306 |

    Fluppets und Snorgs: Gute und böse Tiere (bewegen sich, erhöhen/reduzieren Energie)

    307 |

    Zugars und Toxifera: Gute und böse Pflanzen

    308 |

    Spielfeld diskret, begrenzte Sichtweite der Bots/Minibots

    309 |
    310 |
    311 | 312 |
    313 |
    314 |

    Scalatron

    315 |

    Kommunikation mit Textprotokoll:

    Command(key=value,...)|Command(...)|...

    316 |

    Kommandos:

    317 |
      318 |
    • Move(direction=dx:dy)
    • 319 |
    • Spawn(direction=dx:dy,name=string,energy=int,...)
    • 320 |
    • Set(key=value,...) (werden mit React mitübergeben)
    • 321 |
    • Explode(size=int) (nur Mini-Bots)
    • 322 |
    • „Debugging-Tools” Log, Say, Status, MarkCell, ...
    • 323 |
    324 |

    Infos:

    325 |
      326 |
    • Welcome, Goodbye (mit Statusinfos)
    • 327 |
    • React (Infos über Umgebung, Energiepegel, Kollisionsereignis, etc.)
    • 328 |
    329 |
    330 |
    331 |
    332 | 333 | 334 |
    335 |
    336 |
    337 |

    Hardware für Programmierer

    338 | 339 |
    340 |
    341 | 342 |
    343 |
    344 | 345 |
    346 |
    347 |
    348 |

    Wieviele Programmierer braucht man, um eine Glühbirne zu wechseln?

    349 |
    350 |
    351 |

    Ein Programmierer würde nie etwas anfassen, das mit Hardware zu tun hat.

    352 |
    353 |
    354 | 355 |
    356 |
    357 |

    Der Arduino!

    358 | 359 |

    Open-Source-Hardware- und Software-Plattform für Physical Computing

    360 |

    ATmega-CPU, typisch 32 kB Flash, 2 kb RAM

    361 |

    Verschiedenste Versionen und Nachbauten

    362 |

    Boot Loader zum Flashen von Software via USB

    363 |

    „Robuste“ Bauteile verzeihen Fehler und Ungenauigkeiten

    364 |

    Rapid Prototyping für alle möglichen Ideen in Hardware

    365 |
    366 |
    367 | 368 |
    369 |
    370 |

    ...und eine Reihe Seelenverwandter

    371 |

    Arduino-Variationen und ähnliche Plattformen:

    372 |
      373 |
    • Tinkerforge (Schwerpunkt Module)
    • 374 |
    • Smartduino (Arduino stärker modularisiert, Modul-Bus)
    • 375 |
    • Teensyduino (Arduino mit USB HCI)
    • 376 |
    • LilyPad (Arduino speziell für Wearable Computing)
    • 377 |
    • ...
    • 378 |
    379 |
    380 |
    381 | 382 |
    383 |
    384 |

    „Breadboard“ statt Löten

    385 |

    Stecken von Kabeln und Bauteilen

    386 |

    Breadboard erzeugt Kontakte

    387 |

    Ermöglicht schnelles und einfaches Ausprobieren

    388 |
    389 |
    390 |
    391 | 392 |
    393 |
    394 |

    Shields - für komplexere Erweiterungen

    395 |

    Aufstecken auf Arduino-Board

    396 |

    Für Software: Meist zugehörige Library

    397 |

    Großes Ökosystem an Anbietern

    398 |
    399 | 400 | 401 |
    402 |
    403 |
    404 | 405 |
    406 |
    407 |

    Makey Makey

    408 |

    Noch weniger Hardwarekontakt!

    409 |
    410 |
    411 | (Video bei Youtube) 412 | 413 |
    414 |

    Meldet sich als USB-Tastatur.

    415 |

    Arduino-basiert, kann programmiert werden.

    416 |
    417 |
    418 | 419 |
    420 |
    421 |

    Ideen: Build Server Status Traffic Lights

    422 |
    423 | 424 |
    425 |
    426 |
    427 | 428 |
    429 |
    430 |

    Ideen: Der etwas andere Wecker

    431 |
    432 | 433 |
    434 |
    435 |
    436 | 437 |
    438 |
    439 |

    Ideen: Steuerung für Dronen/Copter
    (Ardupilot)

    440 |
    441 | 442 |
    443 |
    444 |
    445 | 446 |
    447 |
    448 |

    Ideen: Laserharfe

    449 |
    450 | 451 |
    452 |
    453 |
    454 | 455 |
    456 |
    457 |

    Ideen: Reverse Geocache

    458 |
    459 |
    460 |
    461 | 462 | 463 |
    464 |
    465 |
    466 | 467 |
    468 |
    469 |

    Software in C

    470 |

    Arduino-IDE vereinfacht Cross-Kompilierung und Upload

    471 |

    Alternative Eclipse-IDE

    472 |

    ...oder auf die Kommandozeilen-Tools zugreifen (gcc)

    473 |

    Statt main(int,char**): setup() und loop()

    474 |
    
    475 | int ledPin1 = 13;
    476 | 
    477 | void setup() {
    478 |   // Initialisierung
    479 |   pinMode(ledPin1, OUTPUT);
    480 | }
    481 | 
    482 | void loop() {
    483 |   // Ausführung in Endlosschleife
    484 |   digitalWrite(ledPin1, HIGH);
    485 |   delay(500);
    486 |   digitalWrite(ledPin1, LOW);
    487 |   delay(500);
    488 | }
    489 |               
    490 |
    491 |
    492 |
    493 | 494 | 495 |
    496 |
    497 | 498 |

    Frohe Weihnachten!

    499 |
    500 |
    501 | 502 |
    503 |
    504 |

    Bildnachweise

    505 | 517 |
    518 |
    519 | 520 |
    521 |
    522 |
    523 |
    524 |
    525 |
    526 |

    This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

    527 |
    528 |
    Creative Commons License
    529 |
    530 |
    531 | 532 |
    533 | 534 |
    535 | 536 | 537 | 538 | 539 | 565 | 566 | 567 | 568 | --------------------------------------------------------------------------------