reveal-ck 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +24 -129
  3. data/bin/reveal-ck +3 -2
  4. data/lib/reveal-ck.rb +1 -1
  5. data/lib/reveal-ck/presentation_builder.rb +5 -5
  6. data/lib/reveal-ck/template_processor.rb +29 -0
  7. data/lib/reveal-ck/version.rb +1 -1
  8. data/reveal.js/Gruntfile.js +6 -2
  9. data/reveal.js/README.md +139 -31
  10. data/reveal.js/css/print/paper.css +1 -1
  11. data/reveal.js/css/print/pdf.css +1 -1
  12. data/reveal.js/css/reveal.css +134 -88
  13. data/reveal.js/css/reveal.min.css +1 -1
  14. data/reveal.js/css/theme/template/settings.scss +1 -0
  15. data/reveal.js/css/theme/template/theme.scss +1 -1
  16. data/reveal.js/index.html +7 -6
  17. data/reveal.js/js/reveal.js +496 -299
  18. data/reveal.js/js/reveal.min.js +2 -2
  19. data/reveal.js/lib/css/zenburn.css +16 -17
  20. data/reveal.js/package.json +10 -9
  21. data/reveal.js/plugin/leap/leap.js +157 -0
  22. data/reveal.js/plugin/markdown/example.html +3 -2
  23. data/reveal.js/plugin/markdown/example.md +2 -0
  24. data/reveal.js/plugin/markdown/markdown.js +273 -143
  25. data/reveal.js/plugin/math/math.js +64 -0
  26. data/reveal.js/plugin/notes/notes.html +27 -17
  27. data/reveal.js/plugin/notes/notes.js +25 -47
  28. data/reveal.js/{examples → test/examples}/assets/image1.png +0 -0
  29. data/reveal.js/{examples → test/examples}/assets/image2.png +0 -0
  30. data/reveal.js/{examples → test/examples}/barebones.html +3 -3
  31. data/reveal.js/{examples → test/examples}/embedded-media.html +4 -4
  32. data/reveal.js/test/examples/math.html +185 -0
  33. data/reveal.js/{examples → test/examples}/slide-backgrounds.html +4 -4
  34. data/reveal.js/test/qunit-1.12.0.css +244 -0
  35. data/reveal.js/test/qunit-1.12.0.js +2212 -0
  36. data/reveal.js/test/test-markdown.html +52 -0
  37. data/reveal.js/test/test-markdown.js +15 -0
  38. data/reveal.js/test/test.html +62 -0
  39. data/reveal.js/test/test.js +353 -0
  40. data/spec/data/haml/basic.haml +2 -2
  41. data/spec/data/html/converted_basic_slim.html +10 -0
  42. data/spec/data/slim/basic.slim +5 -0
  43. data/spec/lib/reveal-ck/template_processor_spec.rb +29 -0
  44. metadata +50 -9
  45. data/lib/reveal-ck/haml_processor.rb +0 -26
  46. data/spec/lib/reveal-ck/haml_processor_spec.rb +0 -40
@@ -49,7 +49,7 @@ body, p, td, li, div, a {
49
49
  }
50
50
 
51
51
  /* SECTION 4: Set heading font face, sizes, and color.
52
- Diffrentiate your headings from your body text.
52
+ Differentiate your headings from your body text.
53
53
  Perhaps use a large sans-serif for distinction. */
54
54
  h1,h2,h3,h4,h5,h6 {
55
55
  color: #000!important;
@@ -56,7 +56,7 @@ body, p, td, li, div {
56
56
  }
57
57
 
58
58
  /* SECTION 4: Set heading font face, sizes, and color.
59
- Diffrentiate your headings from your body text.
59
+ Differentiate your headings from your body text.
60
60
  Perhaps use a large sans-serif for distinction. */
61
61
  h1,h2,h3,h4,h5,h6 {
62
62
  text-shadow: 0 0 0 #000 !important;
@@ -205,6 +205,10 @@ body {
205
205
  font-style: italic;
206
206
  }
207
207
 
208
+ .reveal iframe {
209
+ z-index: 1;
210
+ }
211
+
208
212
  /* Ensure certain elements are never larger than the slide itself */
209
213
  .reveal img,
210
214
  .reveal video,
@@ -314,6 +318,14 @@ body {
314
318
  max-height: 400px;
315
319
  word-wrap: normal;
316
320
  }
321
+ .reveal pre.stretch code {
322
+ height: 100%;
323
+ max-height: 100%;
324
+
325
+ -webkit-box-sizing: border-box;
326
+ -moz-box-sizing: border-box;
327
+ box-sizing: border-box;
328
+ }
317
329
 
318
330
  .reveal table th,
319
331
  .reveal table td {
@@ -343,6 +355,11 @@ body {
343
355
  vertical-align: top;
344
356
  }
345
357
 
358
+ .reveal .stretch {
359
+ max-width: none;
360
+ max-height: none;
361
+ }
362
+
346
363
 
347
364
  /*********************************************
348
365
  * CONTROLS
@@ -460,90 +477,6 @@ body {
460
477
  }
461
478
 
462
479
 
463
- /*********************************************
464
- * ROLLING LINKS
465
- *********************************************/
466
-
467
- .reveal .roll {
468
- display: inline-block;
469
- line-height: 1.2;
470
- overflow: hidden;
471
-
472
- vertical-align: top;
473
-
474
- -webkit-perspective: 400px;
475
- -moz-perspective: 400px;
476
- -ms-perspective: 400px;
477
- perspective: 400px;
478
-
479
- -webkit-perspective-origin: 50% 50%;
480
- -moz-perspective-origin: 50% 50%;
481
- -ms-perspective-origin: 50% 50%;
482
- perspective-origin: 50% 50%;
483
- }
484
- .reveal .roll:hover {
485
- background: none;
486
- text-shadow: none;
487
- }
488
- .reveal .roll span {
489
- display: block;
490
- position: relative;
491
- padding: 0 2px;
492
-
493
- pointer-events: none;
494
-
495
- -webkit-transition: all 400ms ease;
496
- -moz-transition: all 400ms ease;
497
- -ms-transition: all 400ms ease;
498
- transition: all 400ms ease;
499
-
500
- -webkit-transform-origin: 50% 0%;
501
- -moz-transform-origin: 50% 0%;
502
- -ms-transform-origin: 50% 0%;
503
- transform-origin: 50% 0%;
504
-
505
- -webkit-transform-style: preserve-3d;
506
- -moz-transform-style: preserve-3d;
507
- -ms-transform-style: preserve-3d;
508
- transform-style: preserve-3d;
509
-
510
- -webkit-backface-visibility: hidden;
511
- -moz-backface-visibility: hidden;
512
- backface-visibility: hidden;
513
- }
514
- .reveal .roll:hover span {
515
- background: rgba(0,0,0,0.5);
516
-
517
- -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
518
- -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
519
- -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
520
- transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
521
- }
522
- .reveal .roll span:after {
523
- content: attr(data-title);
524
-
525
- display: block;
526
- position: absolute;
527
- left: 0;
528
- top: 0;
529
- padding: 0 2px;
530
-
531
- -webkit-backface-visibility: hidden;
532
- -moz-backface-visibility: hidden;
533
- backface-visibility: hidden;
534
-
535
- -webkit-transform-origin: 50% 0%;
536
- -moz-transform-origin: 50% 0%;
537
- -ms-transform-origin: 50% 0%;
538
- transform-origin: 50% 0%;
539
-
540
- -webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
541
- -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
542
- -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
543
- transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
544
- }
545
-
546
-
547
480
  /*********************************************
548
481
  * SLIDES
549
482
  *********************************************/
@@ -584,6 +517,10 @@ body {
584
517
  perspective-origin: 0px -100px;
585
518
  }
586
519
 
520
+ .reveal .slides>section {
521
+ -ms-perspective: 600px;
522
+ }
523
+
587
524
  .reveal .slides>section,
588
525
  .reveal .slides>section>section {
589
526
  display: none;
@@ -673,6 +610,19 @@ body {
673
610
  min-height: auto !important;
674
611
  }
675
612
 
613
+ /* Don't allow interaction with invisible slides */
614
+ .reveal .slides>section.future,
615
+ .reveal .slides>section>section.future,
616
+ .reveal .slides>section.past,
617
+ .reveal .slides>section>section.past {
618
+ pointer-events: none;
619
+ }
620
+
621
+ .reveal.overview .slides>section,
622
+ .reveal.overview .slides>section>section {
623
+ pointer-events: auto;
624
+ }
625
+
676
626
 
677
627
 
678
628
  /*********************************************
@@ -1104,8 +1054,8 @@ body {
1104
1054
 
1105
1055
  .reveal.fade.overview .slides section,
1106
1056
  .reveal.fade.overview .slides>section>section,
1107
- .reveal.fade.exit-overview .slides section,
1108
- .reveal.fade.exit-overview .slides>section>section {
1057
+ .reveal.fade.overview-deactivating .slides section,
1058
+ .reveal.fade.overview-deactivating .slides>section>section {
1109
1059
  -webkit-transition: none;
1110
1060
  -moz-transition: none;
1111
1061
  -ms-transition: none;
@@ -1152,9 +1102,10 @@ body {
1152
1102
 
1153
1103
  .reveal.overview .slides section {
1154
1104
  height: 600px;
1105
+ top: -300px !important;
1155
1106
  overflow: hidden;
1156
- opacity: 1!important;
1157
- visibility: visible!important;
1107
+ opacity: 1 !important;
1108
+ visibility: visible !important;
1158
1109
  cursor: pointer;
1159
1110
  background: rgba(0,0,0,0.1);
1160
1111
  }
@@ -1177,6 +1128,7 @@ body {
1177
1128
  }
1178
1129
  .reveal.overview .slides>section.stack {
1179
1130
  padding: 0;
1131
+ top: 0 !important;
1180
1132
  background: none;
1181
1133
  overflow: visible;
1182
1134
  }
@@ -1345,6 +1297,16 @@ body {
1345
1297
  visibility: visible !important;
1346
1298
  }
1347
1299
 
1300
+ /* Immediate transition style */
1301
+ .reveal[data-background-transition=none]>.backgrounds .slide-background,
1302
+ .reveal>.backgrounds .slide-background[data-background-transition=none] {
1303
+ -webkit-transition: none;
1304
+ -moz-transition: none;
1305
+ -ms-transition: none;
1306
+ -o-transition: none;
1307
+ transition: none;
1308
+ }
1309
+
1348
1310
  /* Linear sliding transition style */
1349
1311
  .reveal[data-background-transition=slide]>.backgrounds .slide-background,
1350
1312
  .reveal>.backgrounds .slide-background[data-background-transition=slide] {
@@ -1564,6 +1526,90 @@ body {
1564
1526
  }
1565
1527
 
1566
1528
 
1529
+ /*********************************************
1530
+ * ROLLING LINKS
1531
+ *********************************************/
1532
+
1533
+ .reveal .roll {
1534
+ display: inline-block;
1535
+ line-height: 1.2;
1536
+ overflow: hidden;
1537
+
1538
+ vertical-align: top;
1539
+
1540
+ -webkit-perspective: 400px;
1541
+ -moz-perspective: 400px;
1542
+ -ms-perspective: 400px;
1543
+ perspective: 400px;
1544
+
1545
+ -webkit-perspective-origin: 50% 50%;
1546
+ -moz-perspective-origin: 50% 50%;
1547
+ -ms-perspective-origin: 50% 50%;
1548
+ perspective-origin: 50% 50%;
1549
+ }
1550
+ .reveal .roll:hover {
1551
+ background: none;
1552
+ text-shadow: none;
1553
+ }
1554
+ .reveal .roll span {
1555
+ display: block;
1556
+ position: relative;
1557
+ padding: 0 2px;
1558
+
1559
+ pointer-events: none;
1560
+
1561
+ -webkit-transition: all 400ms ease;
1562
+ -moz-transition: all 400ms ease;
1563
+ -ms-transition: all 400ms ease;
1564
+ transition: all 400ms ease;
1565
+
1566
+ -webkit-transform-origin: 50% 0%;
1567
+ -moz-transform-origin: 50% 0%;
1568
+ -ms-transform-origin: 50% 0%;
1569
+ transform-origin: 50% 0%;
1570
+
1571
+ -webkit-transform-style: preserve-3d;
1572
+ -moz-transform-style: preserve-3d;
1573
+ -ms-transform-style: preserve-3d;
1574
+ transform-style: preserve-3d;
1575
+
1576
+ -webkit-backface-visibility: hidden;
1577
+ -moz-backface-visibility: hidden;
1578
+ backface-visibility: hidden;
1579
+ }
1580
+ .reveal .roll:hover span {
1581
+ background: rgba(0,0,0,0.5);
1582
+
1583
+ -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
1584
+ -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
1585
+ -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
1586
+ transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
1587
+ }
1588
+ .reveal .roll span:after {
1589
+ content: attr(data-title);
1590
+
1591
+ display: block;
1592
+ position: absolute;
1593
+ left: 0;
1594
+ top: 0;
1595
+ padding: 0 2px;
1596
+
1597
+ -webkit-backface-visibility: hidden;
1598
+ -moz-backface-visibility: hidden;
1599
+ backface-visibility: hidden;
1600
+
1601
+ -webkit-transform-origin: 50% 0%;
1602
+ -moz-transform-origin: 50% 0%;
1603
+ -ms-transform-origin: 50% 0%;
1604
+ transform-origin: 50% 0%;
1605
+
1606
+ -webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
1607
+ -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
1608
+ -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
1609
+ transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
1610
+ }
1611
+
1612
+
1567
1613
  /*********************************************
1568
1614
  * SPEAKER NOTES
1569
1615
  *********************************************/
@@ -4,4 +4,4 @@
4
4
  * MIT licensed
5
5
  *
6
6
  * Copyright (C) 2013 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}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.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(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.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.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.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 video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.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 q{font-style:italic}.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 code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.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:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-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 .controls div.enabled{opacity:.7;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-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.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.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.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(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;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.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.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[data-transition=default].past,.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[data-transition=default].future,.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[data-transition=default].past,.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[data-transition=default].future,.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 .slides>section[data-transition=concave].past,.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 .slides>section[data-transition=concave].future,.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 .slides>section>section[data-transition=concave].past,.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 .slides>section>section[data-transition=concave].future,.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 .slides>section[data-transition=zoom].past,.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 .slides>section[data-transition=zoom].future,.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 .slides>section>section[data-transition=zoom].past,.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 .slides>section>section[data-transition=zoom].future,.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 section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.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 .slides>section[data-transition=linear].future,.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 .slides>section>section[data-transition=linear].past,.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 .slides>section>section[data-transition=linear].future,.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:700px;-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:700px;-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 .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.exit-overview .slides section,.reveal.fade.exit-overview .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.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 .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .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;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.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)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);transition:all 600ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-duration:800ms;-moz-transition-duration:800ms;-ms-transition-duration:800ms;-o-transition-duration:800ms;transition-duration:800ms}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.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.rtl .progress span{float:right}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.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}
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}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.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(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.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.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.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 iframe{z-index:1}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.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 q{font-style:italic}.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 code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal pre.stretch code{height:100%;max-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.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 .stretch{max-width:none;max-height:none}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-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 .controls div.enabled{opacity:.7;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-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.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.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;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{-ms-perspective:600px}.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.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.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.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section[data-transition=default].past,.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[data-transition=default].future,.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[data-transition=default].past,.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[data-transition=default].future,.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 .slides>section[data-transition=concave].past,.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 .slides>section[data-transition=concave].future,.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 .slides>section>section[data-transition=concave].past,.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 .slides>section>section[data-transition=concave].future,.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 .slides>section[data-transition=zoom].past,.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 .slides>section[data-transition=zoom].future,.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 .slides>section>section[data-transition=zoom].past,.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 .slides>section>section[data-transition=zoom].future,.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 section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.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 .slides>section[data-transition=linear].future,.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 .slides>section>section[data-transition=linear].past,.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 .slides>section>section[data-transition=linear].future,.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:700px;-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:700px;-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 .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.overview-deactivating .slides section,.reveal.fade.overview-deactivating .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.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;top:-300px!important;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;top:0!important;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 .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .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;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.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)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);transition:all 600ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-duration:800ms;-moz-transition-duration:800ms;-ms-transition-duration:800ms;-o-transition-duration:800ms;transition-duration:800ms}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.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.rtl .progress span{float:right}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.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(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.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}
@@ -10,6 +10,7 @@ $mainFontSize: 36px;
10
10
  $mainColor: #eee;
11
11
 
12
12
  // Headings
13
+ $headingMargin: 0 0 20px 0;
13
14
  $headingFont: 'League Gothic', Impact, sans-serif;
14
15
  $headingColor: #eee;
15
16
  $headingLineHeight: 0.9em;
@@ -33,7 +33,7 @@ body {
33
33
  .reveal h4,
34
34
  .reveal h5,
35
35
  .reveal h6 {
36
- margin: 0 0 20px 0;
36
+ margin: $headingMargin;
37
37
  color: $headingColor;
38
38
 
39
39
  font-family: $headingFont;
data/reveal.js/index.html CHANGED
@@ -167,12 +167,15 @@
167
167
  <h2>Themes</h2>
168
168
  <p>
169
169
  Reveal.js comes with a few themes built in: <br>
170
+ <a href="?#/themes">Default</a> -
170
171
  <a href="?theme=sky#/themes">Sky</a> -
171
172
  <a href="?theme=beige#/themes">Beige</a> -
172
173
  <a href="?theme=simple#/themes">Simple</a> -
173
174
  <a href="?theme=serif#/themes">Serif</a> -
174
- <a href="?theme=night#/themes">Night</a> -
175
- <a href="?#/themes">Default</a>
175
+ <a href="?theme=night#/themes">Night</a> <br>
176
+ <a href="?theme=moon.css#/themes">Moon</a> -
177
+ <a href="?theme=simple.css#/themes">Simple</a> -
178
+ <a href="?theme=solarized.css#/themes">Solarized</a>
176
179
  </p>
177
180
  <p>
178
181
  <small>
@@ -259,10 +262,10 @@ function linkify( selector ) {
259
262
  for( var i = 0, len = nodes.length; i &lt; len; i++ ) {
260
263
  var node = nodes[i];
261
264
 
262
- if( !node.className ) ) {
265
+ if( !node.className ) {
263
266
  node.className += ' roll';
264
267
  }
265
- };
268
+ }
266
269
  }
267
270
  }
268
271
  </code></pre>
@@ -371,8 +374,6 @@ function linkify( selector ) {
371
374
  { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
372
375
  { src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
373
376
  { src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
374
- // { src: 'plugin/search/search.js', async: true, condition: function() { return !!document.body.classList; } }
375
- // { src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } }
376
377
  ]
377
378
  });
378
379
 
@@ -59,6 +59,10 @@ var Reveal = (function(){
59
59
  // Turns fragments on and off globally
60
60
  fragments: true,
61
61
 
62
+ // Flags if the presentation is running in an embedded mode,
63
+ // i.e. contained within a limited portion of the screen
64
+ embedded: false,
65
+
62
66
  // Number of milliseconds between automatically proceeding to the
63
67
  // next slide, disabled when set to 0, this value can be overwritten
64
68
  // by using a data-autoslide attribute on your slides
@@ -68,7 +72,7 @@ var Reveal = (function(){
68
72
  mouseWheel: false,
69
73
 
70
74
  // Apply a 3D roll to links on hover
71
- rollingLinks: true,
75
+ rollingLinks: false,
72
76
 
73
77
  // Opens links in an iframe preview overlay
74
78
  previewLinks: false,
@@ -83,18 +87,24 @@ var Reveal = (function(){
83
87
  transitionSpeed: 'default', // default/fast/slow
84
88
 
85
89
  // Transition style for full page slide backgrounds
86
- backgroundTransition: 'default', // default/linear
90
+ backgroundTransition: 'default', // default/linear/none
91
+
92
+ // Number of slides away from the current that are visible
93
+ viewDistance: 3,
87
94
 
88
95
  // Script dependencies to load
89
96
  dependencies: []
90
97
  },
91
98
 
99
+ // Flags if reveal.js is loaded (has dispatched the 'ready' event)
100
+ loaded = false,
101
+
92
102
  // The current auto-slide duration
93
103
  autoSlide = 0,
94
104
 
95
105
  // The horizontal and vertical index of the currently active slide
96
- indexh = 0,
97
- indexv = 0,
106
+ indexh,
107
+ indexv,
98
108
 
99
109
  // The previous and current slide HTML elements
100
110
  previousSlide,
@@ -111,19 +121,14 @@ var Reveal = (function(){
111
121
  // Cached references to DOM elements
112
122
  dom = {},
113
123
 
114
- // Detect support for CSS 3D transforms
115
- supports3DTransforms = 'WebkitPerspective' in document.body.style ||
116
- 'MozPerspective' in document.body.style ||
117
- 'msPerspective' in document.body.style ||
118
- 'OPerspective' in document.body.style ||
119
- 'perspective' in document.body.style,
124
+ // Client support for CSS 3D transforms, see #checkCapabilities()
125
+ supports3DTransforms,
120
126
 
121
- // Detect support for CSS 2D transforms
122
- supports2DTransforms = 'WebkitTransform' in document.body.style ||
123
- 'MozTransform' in document.body.style ||
124
- 'msTransform' in document.body.style ||
125
- 'OTransform' in document.body.style ||
126
- 'transform' in document.body.style,
127
+ // Client support for CSS 2D transforms, see #checkCapabilities()
128
+ supports2DTransforms,
129
+
130
+ // Client is a mobile device, see #checkCapabilities()
131
+ isMobileDevice,
127
132
 
128
133
  // Throttles mouse wheel navigation
129
134
  lastMouseWheelStep = 0,
@@ -149,8 +154,8 @@ var Reveal = (function(){
149
154
  startY: 0,
150
155
  startSpan: 0,
151
156
  startCount: 0,
152
- handled: false,
153
- threshold: 80
157
+ captured: false,
158
+ threshold: 40
154
159
  };
155
160
 
156
161
  /**
@@ -158,6 +163,8 @@ var Reveal = (function(){
158
163
  */
159
164
  function initialize( options ) {
160
165
 
166
+ checkCapabilities();
167
+
161
168
  if( !supports2DTransforms && !supports3DTransforms ) {
162
169
  document.body.setAttribute( 'class', 'no-transforms' );
163
170
 
@@ -180,6 +187,136 @@ var Reveal = (function(){
180
187
 
181
188
  }
182
189
 
190
+ /**
191
+ * Inspect the client to see what it's capable of, this
192
+ * should only happens once per runtime.
193
+ */
194
+ function checkCapabilities() {
195
+
196
+ supports3DTransforms = 'WebkitPerspective' in document.body.style ||
197
+ 'MozPerspective' in document.body.style ||
198
+ 'msPerspective' in document.body.style ||
199
+ 'OPerspective' in document.body.style ||
200
+ 'perspective' in document.body.style;
201
+
202
+ supports2DTransforms = 'WebkitTransform' in document.body.style ||
203
+ 'MozTransform' in document.body.style ||
204
+ 'msTransform' in document.body.style ||
205
+ 'OTransform' in document.body.style ||
206
+ 'transform' in document.body.style;
207
+
208
+ isMobileDevice = navigator.userAgent.match( /(iphone|ipod|android)/gi );
209
+
210
+ }
211
+
212
+ /**
213
+ * Loads the dependencies of reveal.js. Dependencies are
214
+ * defined via the configuration option 'dependencies'
215
+ * and will be loaded prior to starting/binding reveal.js.
216
+ * Some dependencies may have an 'async' flag, if so they
217
+ * will load after reveal.js has been started up.
218
+ */
219
+ function load() {
220
+
221
+ var scripts = [],
222
+ scriptsAsync = [];
223
+
224
+ for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
225
+ var s = config.dependencies[i];
226
+
227
+ // Load if there's no condition or the condition is truthy
228
+ if( !s.condition || s.condition() ) {
229
+ if( s.async ) {
230
+ scriptsAsync.push( s.src );
231
+ }
232
+ else {
233
+ scripts.push( s.src );
234
+ }
235
+
236
+ // Extension may contain callback functions
237
+ if( typeof s.callback === 'function' ) {
238
+ head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback );
239
+ }
240
+ }
241
+ }
242
+
243
+ // Called once synchronous scripts finish loading
244
+ function proceed() {
245
+ if( scriptsAsync.length ) {
246
+ // Load asynchronous scripts
247
+ head.js.apply( null, scriptsAsync );
248
+ }
249
+
250
+ start();
251
+ }
252
+
253
+ if( scripts.length ) {
254
+ head.ready( proceed );
255
+
256
+ // Load synchronous scripts
257
+ head.js.apply( null, scripts );
258
+ }
259
+ else {
260
+ proceed();
261
+ }
262
+
263
+ }
264
+
265
+ /**
266
+ * Starts up reveal.js by binding input events and navigating
267
+ * to the current URL deeplink if there is one.
268
+ */
269
+ function start() {
270
+
271
+ // Make sure we've got all the DOM elements we need
272
+ setupDOM();
273
+
274
+ // Decorate the slide DOM elements with state classes (past/future)
275
+ setupSlides();
276
+
277
+ // Updates the presentation to match the current configuration values
278
+ configure();
279
+
280
+ // Read the initial hash
281
+ readURL();
282
+
283
+ // Notify listeners that the presentation is ready but use a 1ms
284
+ // timeout to ensure it's not fired synchronously after #initialize()
285
+ setTimeout( function() {
286
+ // Enable transitions now that we're loaded
287
+ dom.slides.classList.remove( 'no-transition' );
288
+
289
+ loaded = true;
290
+
291
+ dispatchEvent( 'ready', {
292
+ 'indexh': indexh,
293
+ 'indexv': indexv,
294
+ 'currentSlide': currentSlide
295
+ } );
296
+ }, 1 );
297
+
298
+ }
299
+
300
+ /**
301
+ * Iterates through and decorates slides DOM elements with
302
+ * appropriate classes.
303
+ */
304
+ function setupSlides() {
305
+
306
+ var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
307
+ horizontalSlides.forEach( function( horizontalSlide ) {
308
+
309
+ var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
310
+ verticalSlides.forEach( function( verticalSlide, y ) {
311
+
312
+ if( y > 0 ) verticalSlide.classList.add( 'future' );
313
+
314
+ } );
315
+
316
+ } );
317
+
318
+ }
319
+
183
320
  /**
184
321
  * Finds and stores references to DOM elements which are
185
322
  * required by the presentation. If a required element is
@@ -192,61 +329,59 @@ var Reveal = (function(){
192
329
  dom.wrapper = document.querySelector( '.reveal' );
193
330
  dom.slides = document.querySelector( '.reveal .slides' );
194
331
 
332
+ // Prevent transitions while we're loading
333
+ dom.slides.classList.add( 'no-transition' );
334
+
195
335
  // Background element
196
- if( !document.querySelector( '.reveal .backgrounds' ) ) {
197
- dom.background = document.createElement( 'div' );
198
- dom.background.classList.add( 'backgrounds' );
199
- dom.wrapper.appendChild( dom.background );
200
- }
336
+ dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null );
201
337
 
202
338
  // Progress bar
203
- if( !dom.wrapper.querySelector( '.progress' ) ) {
204
- var progressElement = document.createElement( 'div' );
205
- progressElement.classList.add( 'progress' );
206
- progressElement.innerHTML = '<span></span>';
207
- dom.wrapper.appendChild( progressElement );
208
- }
339
+ dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '<span></span>' );
340
+ dom.progressbar = dom.progress.querySelector( 'span' );
209
341
 
210
342
  // Arrow controls
211
- if( !dom.wrapper.querySelector( '.controls' ) ) {
212
- var controlsElement = document.createElement( 'aside' );
213
- controlsElement.classList.add( 'controls' );
214
- controlsElement.innerHTML = '<div class="navigate-left"></div>' +
215
- '<div class="navigate-right"></div>' +
216
- '<div class="navigate-up"></div>' +
217
- '<div class="navigate-down"></div>';
218
- dom.wrapper.appendChild( controlsElement );
219
- }
343
+ createSingletonNode( dom.wrapper, 'aside', 'controls',
344
+ '<div class="navigate-left"></div>' +
345
+ '<div class="navigate-right"></div>' +
346
+ '<div class="navigate-up"></div>' +
347
+ '<div class="navigate-down"></div>' );
220
348
 
221
349
  // State background element [DEPRECATED]
222
- if( !dom.wrapper.querySelector( '.state-background' ) ) {
223
- var stateBackgroundElement = document.createElement( 'div' );
224
- stateBackgroundElement.classList.add( 'state-background' );
225
- dom.wrapper.appendChild( stateBackgroundElement );
226
- }
350
+ createSingletonNode( dom.wrapper, 'div', 'state-background', null );
227
351
 
228
352
  // Overlay graphic which is displayed during the paused mode
229
- if( !dom.wrapper.querySelector( '.pause-overlay' ) ) {
230
- var pausedElement = document.createElement( 'div' );
231
- pausedElement.classList.add( 'pause-overlay' );
232
- dom.wrapper.appendChild( pausedElement );
233
- }
353
+ createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null );
234
354
 
235
355
  // Cache references to elements
236
- dom.progress = document.querySelector( '.reveal .progress' );
237
- dom.progressbar = document.querySelector( '.reveal .progress span' );
356
+ dom.controls = document.querySelector( '.reveal .controls' );
357
+
358
+ // There can be multiple instances of controls throughout the page
359
+ dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) );
360
+ dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) );
361
+ dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) );
362
+ dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) );
363
+ dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
364
+ dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
365
+
366
+ }
238
367
 
239
- if ( config.controls ) {
240
- dom.controls = document.querySelector( '.reveal .controls' );
368
+ /**
369
+ * Creates an HTML element and returns a reference to it.
370
+ * If the element already exists the existing instance will
371
+ * be returned.
372
+ */
373
+ function createSingletonNode( container, tagname, classname, innerHTML ) {
241
374
 
242
- // There can be multiple instances of controls throughout the page
243
- dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) );
244
- dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) );
245
- dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) );
246
- dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) );
247
- dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
248
- dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
375
+ var node = container.querySelector( '.' + classname );
376
+ if( !node ) {
377
+ node = document.createElement( tagname );
378
+ node.classList.add( classname );
379
+ if( innerHTML !== null ) {
380
+ node.innerHTML = innerHTML;
381
+ }
382
+ container.appendChild( node );
249
383
  }
384
+ return node;
250
385
 
251
386
  }
252
387
 
@@ -334,99 +469,6 @@ var Reveal = (function(){
334
469
 
335
470
  }
336
471
 
337
- /**
338
- * Hides the address bar if we're on a mobile device.
339
- */
340
- function hideAddressBar() {
341
-
342
- if( /iphone|ipod|android/gi.test( navigator.userAgent ) && !/crios/gi.test( navigator.userAgent ) ) {
343
- // Events that should trigger the address bar to hide
344
- window.addEventListener( 'load', removeAddressBar, false );
345
- window.addEventListener( 'orientationchange', removeAddressBar, false );
346
- }
347
-
348
- }
349
-
350
- /**
351
- * Loads the dependencies of reveal.js. Dependencies are
352
- * defined via the configuration option 'dependencies'
353
- * and will be loaded prior to starting/binding reveal.js.
354
- * Some dependencies may have an 'async' flag, if so they
355
- * will load after reveal.js has been started up.
356
- */
357
- function load() {
358
-
359
- var scripts = [],
360
- scriptsAsync = [];
361
-
362
- for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
363
- var s = config.dependencies[i];
364
-
365
- // Load if there's no condition or the condition is truthy
366
- if( !s.condition || s.condition() ) {
367
- if( s.async ) {
368
- scriptsAsync.push( s.src );
369
- }
370
- else {
371
- scripts.push( s.src );
372
- }
373
-
374
- // Extension may contain callback functions
375
- if( typeof s.callback === 'function' ) {
376
- head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback );
377
- }
378
- }
379
- }
380
-
381
- // Called once synchronous scripts finish loading
382
- function proceed() {
383
- if( scriptsAsync.length ) {
384
- // Load asynchronous scripts
385
- head.js.apply( null, scriptsAsync );
386
- }
387
-
388
- start();
389
- }
390
-
391
- if( scripts.length ) {
392
- head.ready( proceed );
393
-
394
- // Load synchronous scripts
395
- head.js.apply( null, scripts );
396
- }
397
- else {
398
- proceed();
399
- }
400
-
401
- }
402
-
403
- /**
404
- * Starts up reveal.js by binding input events and navigating
405
- * to the current URL deeplink if there is one.
406
- */
407
- function start() {
408
-
409
- // Make sure we've got all the DOM elements we need
410
- setupDOM();
411
-
412
- // Updates the presentation to match the current configuration values
413
- configure();
414
-
415
- // Read the initial hash
416
- readURL();
417
-
418
- // Notify listeners that the presentation is ready but use a 1ms
419
- // timeout to ensure it's not fired synchronously after #initialize()
420
- setTimeout( function() {
421
- dispatchEvent( 'ready', {
422
- 'indexh': indexh,
423
- 'indexv': indexv,
424
- 'currentSlide': currentSlide
425
- } );
426
- }, 1 );
427
-
428
- }
429
-
430
472
  /**
431
473
  * Applies the configuration settings from the config
432
474
  * object. May be called multiple times.
@@ -447,13 +489,8 @@ var Reveal = (function(){
447
489
  dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
448
490
  dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );
449
491
 
450
- if( dom.controls ) {
451
- dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none';
452
- }
453
-
454
- if( dom.progress ) {
455
- dom.progress.style.display = ( config.progress && dom.progress ) ? 'block' : 'none';
456
- }
492
+ dom.controls.style.display = config.controls ? 'block' : 'none';
493
+ dom.progress.style.display = config.progress ? 'block' : 'none';
457
494
 
458
495
  if( config.rtl ) {
459
496
  dom.wrapper.classList.add( 'rtl' );
@@ -542,16 +579,14 @@ var Reveal = (function(){
542
579
  dom.progress.addEventListener( 'click', onProgressClicked, false );
543
580
  }
544
581
 
545
- if ( config.controls && dom.controls ) {
546
- [ 'touchstart', 'click' ].forEach( function( eventName ) {
547
- dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } );
548
- dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } );
549
- dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } );
550
- dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } );
551
- dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } );
552
- dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } );
553
- } );
554
- }
582
+ [ 'touchstart', 'click' ].forEach( function( eventName ) {
583
+ dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } );
584
+ dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } );
585
+ dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } );
586
+ dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } );
587
+ dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } );
588
+ dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } );
589
+ } );
555
590
 
556
591
  }
557
592
 
@@ -580,16 +615,14 @@ var Reveal = (function(){
580
615
  dom.progress.removeEventListener( 'click', onProgressClicked, false );
581
616
  }
582
617
 
583
- if ( config.controls && dom.controls ) {
584
- [ 'touchstart', 'click' ].forEach( function( eventName ) {
585
- dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } );
586
- dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } );
587
- dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } );
588
- dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } );
589
- dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } );
590
- dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } );
591
- } );
592
- }
618
+ [ 'touchstart', 'click' ].forEach( function( eventName ) {
619
+ dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } );
620
+ dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } );
621
+ dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } );
622
+ dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } );
623
+ dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } );
624
+ dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } );
625
+ } );
593
626
 
594
627
  }
595
628
 
@@ -630,6 +663,19 @@ var Reveal = (function(){
630
663
 
631
664
  }
632
665
 
666
+ /**
667
+ * Applies a CSS transform to the target element.
668
+ */
669
+ function transformElement( element, transform ) {
670
+
671
+ element.style.WebkitTransform = transform;
672
+ element.style.MozTransform = transform;
673
+ element.style.msTransform = transform;
674
+ element.style.OTransform = transform;
675
+ element.style.transform = transform;
676
+
677
+ }
678
+
633
679
  /**
634
680
  * Retrieves the height of the given element by looking
635
681
  * at the position and height of its immediate children.
@@ -665,6 +711,48 @@ var Reveal = (function(){
665
711
 
666
712
  }
667
713
 
714
+ /**
715
+ * Returns the remaining height within the parent of the
716
+ * target element after subtracting the height of all
717
+ * siblings.
718
+ *
719
+ * remaining height = [parent height] - [ siblings height]
720
+ */
721
+ function getRemainingHeight( element, height ) {
722
+
723
+ height = height || 0;
724
+
725
+ if( element ) {
726
+ var parent = element.parentNode;
727
+ var siblings = parent.childNodes;
728
+
729
+ // Subtract the height of each sibling
730
+ toArray( siblings ).forEach( function( sibling ) {
731
+
732
+ if( typeof sibling.offsetHeight === 'number' && sibling !== element ) {
733
+
734
+ var styles = window.getComputedStyle( sibling ),
735
+ marginTop = parseInt( styles.marginTop, 10 ),
736
+ marginBottom = parseInt( styles.marginBottom, 10 );
737
+
738
+ height -= sibling.offsetHeight + marginTop + marginBottom;
739
+
740
+ }
741
+
742
+ } );
743
+
744
+ var elementStyles = window.getComputedStyle( element );
745
+
746
+ // Subtract the margins of the target element
747
+ height -= parseInt( elementStyles.marginTop, 10 ) +
748
+ parseInt( elementStyles.marginBottom, 10 );
749
+
750
+ }
751
+
752
+ return height;
753
+
754
+ }
755
+
668
756
  /**
669
757
  * Checks if this instance is being used to print a PDF.
670
758
  */
@@ -674,13 +762,27 @@ var Reveal = (function(){
674
762
 
675
763
  }
676
764
 
765
+ /**
766
+ * Hides the address bar if we're on a mobile device.
767
+ */
768
+ function hideAddressBar() {
769
+
770
+ if( isMobileDevice ) {
771
+ // Events that should trigger the address bar to hide
772
+ window.addEventListener( 'load', removeAddressBar, false );
773
+ window.addEventListener( 'orientationchange', removeAddressBar, false );
774
+ }
775
+
776
+ }
777
+
677
778
  /**
678
779
  * Causes the address bar to hide on mobile devices,
679
780
  * more vertical space ftw.
680
781
  */
681
782
  function removeAddressBar() {
682
783
 
683
- if( window.orientation === 0 ) {
784
+ // Portrait and not Chrome for iOS
785
+ if( window.orientation === 0 && !/crios/gi.test( navigator.userAgent ) ) {
684
786
  document.documentElement.style.overflow = 'scroll';
685
787
  document.body.style.height = '120%';
686
788
  }
@@ -886,7 +988,11 @@ var Reveal = (function(){
886
988
 
887
989
  // Dimensions of the content
888
990
  var slideWidth = config.width,
889
- slideHeight = config.height;
991
+ slideHeight = config.height,
992
+ slidePadding = 20; // TODO Dig this out of DOM
993
+
994
+ // Layout the contents of the slides
995
+ layoutSlideContents( config.width, config.height, slidePadding );
890
996
 
891
997
  // Slide width may be a percentage of available width
892
998
  if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) {
@@ -915,13 +1021,7 @@ var Reveal = (function(){
915
1021
  }
916
1022
  // Apply scale transform as a fallback
917
1023
  else {
918
- var transform = 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)';
919
-
920
- dom.slides.style.WebkitTransform = transform;
921
- dom.slides.style.MozTransform = transform;
922
- dom.slides.style.msTransform = transform;
923
- dom.slides.style.OTransform = transform;
924
- dom.slides.style.transform = transform;
1024
+ transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)' );
925
1025
  }
926
1026
 
927
1027
  // Select all slides, vertical and horizontal
@@ -942,7 +1042,7 @@ var Reveal = (function(){
942
1042
  slide.style.top = 0;
943
1043
  }
944
1044
  else {
945
- slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - 20, -slideHeight / 2 ) + 'px';
1045
+ slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - slidePadding, -slideHeight / 2 ) + 'px';
946
1046
  }
947
1047
  }
948
1048
  else {
@@ -957,6 +1057,38 @@ var Reveal = (function(){
957
1057
 
958
1058
  }
959
1059
 
1060
+ /**
1061
+ * Applies layout logic to the contents of all slides in
1062
+ * the presentation.
1063
+ */
1064
+ function layoutSlideContents( width, height, padding ) {
1065
+
1066
+ // Handle sizing of elements with the 'stretch' class
1067
+ toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) {
1068
+
1069
+ // Determine how much vertical space we can use
1070
+ var remainingHeight = getRemainingHeight( element, ( height - ( padding * 2 ) ) );
1071
+
1072
+ // Consider the aspect ratio of media elements
1073
+ if( /(img|video)/gi.test( element.nodeName ) ) {
1074
+ var nw = element.naturalWidth || element.videoWidth,
1075
+ nh = element.naturalHeight || element.videoHeight;
1076
+
1077
+ var es = Math.min( width / nw, remainingHeight / nh );
1078
+
1079
+ element.style.width = ( nw * es ) + 'px';
1080
+ element.style.height = ( nh * es ) + 'px';
1081
+
1082
+ }
1083
+ else {
1084
+ element.style.width = width + 'px';
1085
+ element.style.height = remainingHeight + 'px';
1086
+ }
1087
+
1088
+ } );
1089
+
1090
+ }
1091
+
960
1092
  /**
961
1093
  * Stores the vertical index of a stack so that the same
962
1094
  * vertical slide can be selected when navigating to and
@@ -1010,8 +1142,11 @@ var Reveal = (function(){
1010
1142
 
1011
1143
  var wasActive = dom.wrapper.classList.contains( 'overview' );
1012
1144
 
1145
+ // Vary the depth of the overview based on screen size
1146
+ var depth = window.innerWidth < 400 ? 1000 : 2500;
1147
+
1013
1148
  dom.wrapper.classList.add( 'overview' );
1014
- dom.wrapper.classList.remove( 'exit-overview' );
1149
+ dom.wrapper.classList.remove( 'overview-deactivating' );
1015
1150
 
1016
1151
  clearTimeout( activateOverviewTimeout );
1017
1152
  clearTimeout( deactivateOverviewTimeout );
@@ -1019,22 +1154,18 @@ var Reveal = (function(){
1019
1154
  // Not the pretties solution, but need to let the overview
1020
1155
  // class apply first so that slides are measured accurately
1021
1156
  // before we can position them
1022
- activateOverviewTimeout = setTimeout( function(){
1157
+ activateOverviewTimeout = setTimeout( function() {
1023
1158
 
1024
1159
  var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
1025
1160
 
1026
1161
  for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
1027
1162
  var hslide = horizontalSlides[i],
1028
- hoffset = config.rtl ? -105 : 105,
1029
- htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)';
1163
+ hoffset = config.rtl ? -105 : 105;
1030
1164
 
1031
1165
  hslide.setAttribute( 'data-index-h', i );
1032
- hslide.style.display = 'block';
1033
- hslide.style.WebkitTransform = htransform;
1034
- hslide.style.MozTransform = htransform;
1035
- hslide.style.msTransform = htransform;
1036
- hslide.style.OTransform = htransform;
1037
- hslide.style.transform = htransform;
1166
+
1167
+ // Apply CSS transform
1168
+ transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' );
1038
1169
 
1039
1170
  if( hslide.classList.contains( 'stack' ) ) {
1040
1171
 
@@ -1043,17 +1174,13 @@ var Reveal = (function(){
1043
1174
  for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
1044
1175
  var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide );
1045
1176
 
1046
- var vslide = verticalSlides[j],
1047
- vtransform = 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)';
1177
+ var vslide = verticalSlides[j];
1048
1178
 
1049
1179
  vslide.setAttribute( 'data-index-h', i );
1050
1180
  vslide.setAttribute( 'data-index-v', j );
1051
- vslide.style.display = 'block';
1052
- vslide.style.WebkitTransform = vtransform;
1053
- vslide.style.MozTransform = vtransform;
1054
- vslide.style.msTransform = vtransform;
1055
- vslide.style.OTransform = vtransform;
1056
- vslide.style.transform = vtransform;
1181
+
1182
+ // Apply CSS transform
1183
+ transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' );
1057
1184
 
1058
1185
  // Navigate to this slide on click
1059
1186
  vslide.addEventListener( 'click', onOverviewSlideClicked, true );
@@ -1068,6 +1195,8 @@ var Reveal = (function(){
1068
1195
  }
1069
1196
  }
1070
1197
 
1198
+ updateSlidesVisibility();
1199
+
1071
1200
  layout();
1072
1201
 
1073
1202
  if( !wasActive ) {
@@ -1102,29 +1231,19 @@ var Reveal = (function(){
1102
1231
  // Temporarily add a class so that transitions can do different things
1103
1232
  // depending on whether they are exiting/entering overview, or just
1104
1233
  // moving from slide to slide
1105
- dom.wrapper.classList.add( 'exit-overview' );
1234
+ dom.wrapper.classList.add( 'overview-deactivating' );
1106
1235
 
1107
1236
  deactivateOverviewTimeout = setTimeout( function () {
1108
- dom.wrapper.classList.remove( 'exit-overview' );
1109
- }, 10);
1237
+ dom.wrapper.classList.remove( 'overview-deactivating' );
1238
+ }, 1 );
1110
1239
 
1111
1240
  // Select all slides
1112
- var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
1113
-
1114
- for( var i = 0, len = slides.length; i < len; i++ ) {
1115
- var element = slides[i];
1116
-
1117
- element.style.display = '';
1118
-
1241
+ toArray( document.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
1119
1242
  // Resets all transforms to use the external styles
1120
- element.style.WebkitTransform = '';
1121
- element.style.MozTransform = '';
1122
- element.style.msTransform = '';
1123
- element.style.OTransform = '';
1124
- element.style.transform = '';
1243
+ transformElement( slide, '' );
1125
1244
 
1126
- element.removeEventListener( 'click', onOverviewSlideClicked, true );
1127
- }
1245
+ slide.removeEventListener( 'click', onOverviewSlideClicked, true );
1246
+ } );
1128
1247
 
1129
1248
  slide( indexh, indexv );
1130
1249
 
@@ -1182,7 +1301,7 @@ var Reveal = (function(){
1182
1301
  // Prefer slide argument, otherwise use current slide
1183
1302
  slide = slide ? slide : currentSlide;
1184
1303
 
1185
- return slide && !!slide.parentNode.nodeName.match( /section/i );
1304
+ return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );
1186
1305
 
1187
1306
  }
1188
1307
 
@@ -1302,13 +1421,16 @@ var Reveal = (function(){
1302
1421
  // Reset the state array
1303
1422
  state.length = 0;
1304
1423
 
1305
- var indexhBefore = indexh,
1306
- indexvBefore = indexv;
1424
+ var indexhBefore = indexh || 0,
1425
+ indexvBefore = indexv || 0;
1307
1426
 
1308
1427
  // Activate and transition to the new slide
1309
1428
  indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
1310
1429
  indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
1311
1430
 
1431
+ // Update the visibility of slides now that the indices have changed
1432
+ updateSlidesVisibility();
1433
+
1312
1434
  layout();
1313
1435
 
1314
1436
  // Apply the new state
@@ -1338,10 +1460,6 @@ var Reveal = (function(){
1338
1460
  activateOverview();
1339
1461
  }
1340
1462
 
1341
- // Update the URL hash after a delay since updating it mid-transition
1342
- // is likely to cause visual lag
1343
- writeURL( 1500 );
1344
-
1345
1463
  // Find the current horizontal slide and any possible vertical slides
1346
1464
  // within it
1347
1465
  var currentHorizontalSlide = horizontalSlides[ indexh ],
@@ -1413,6 +1531,9 @@ var Reveal = (function(){
1413
1531
  updateProgress();
1414
1532
  updateBackground();
1415
1533
 
1534
+ // Update the URL hash
1535
+ writeURL();
1536
+
1416
1537
  }
1417
1538
 
1418
1539
  /**
@@ -1481,16 +1602,6 @@ var Reveal = (function(){
1481
1602
  for( var i = 0; i < slidesLength; i++ ) {
1482
1603
  var element = slides[i];
1483
1604
 
1484
- // Optimization; hide all slides that are three or more steps
1485
- // away from the present slide
1486
- if( isOverview() === false ) {
1487
- // The distance loops so that it measures 1 between the first
1488
- // and last slides
1489
- var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
1490
-
1491
- element.style.display = distance > 3 ? 'none' : 'block';
1492
- }
1493
-
1494
1605
  var reverse = config.rtl && !isVerticalSlide( element );
1495
1606
 
1496
1607
  element.classList.remove( 'past' );
@@ -1507,6 +1618,13 @@ var Reveal = (function(){
1507
1618
  else if( i > index ) {
1508
1619
  // Any element subsequent to index is given the 'future' class
1509
1620
  element.classList.add( reverse ? 'past' : 'future' );
1621
+
1622
+ var fragments = toArray( element.querySelectorAll( '.fragment.visible' ) );
1623
+
1624
+ // No fragments in future slides should be visible ahead of time
1625
+ while( fragments.length ) {
1626
+ fragments.pop().classList.remove( 'visible' );
1627
+ }
1510
1628
  }
1511
1629
 
1512
1630
  // If this element contains vertical slides
@@ -1526,7 +1644,7 @@ var Reveal = (function(){
1526
1644
  state = state.concat( slideState.split( ' ' ) );
1527
1645
  }
1528
1646
 
1529
- // If this slide has a data-autoslide attribtue associated use this as
1647
+ // If this slide has a data-autoslide attribute associated use this as
1530
1648
  // autoSlide value otherwise use the global configured time
1531
1649
  var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' );
1532
1650
  if( slideAutoSlide ) {
@@ -1536,6 +1654,8 @@ var Reveal = (function(){
1536
1654
  autoSlide = config.autoSlide;
1537
1655
  }
1538
1656
 
1657
+ cueAutoSlide();
1658
+
1539
1659
  }
1540
1660
  else {
1541
1661
  // Since there are no slides we can't be anywhere beyond the
@@ -1547,6 +1667,61 @@ var Reveal = (function(){
1547
1667
 
1548
1668
  }
1549
1669
 
1670
+ /**
1671
+ * Optimization method; hide all slides that are far away
1672
+ * from the present slide.
1673
+ */
1674
+ function updateSlidesVisibility() {
1675
+
1676
+ // Select all slides and convert the NodeList result to
1677
+ // an array
1678
+ var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ),
1679
+ horizontalSlidesLength = horizontalSlides.length,
1680
+ distanceX,
1681
+ distanceY;
1682
+
1683
+ if( horizontalSlidesLength ) {
1684
+
1685
+ // The number of steps away from the present slide that will
1686
+ // be visible
1687
+ var viewDistance = isOverview() ? 10 : config.viewDistance;
1688
+
1689
+ // Limit view distance on weaker devices
1690
+ if( isMobileDevice ) {
1691
+ viewDistance = isOverview() ? 6 : 1;
1692
+ }
1693
+
1694
+ for( var x = 0; x < horizontalSlidesLength; x++ ) {
1695
+ var horizontalSlide = horizontalSlides[x];
1696
+
1697
+ var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ),
1698
+ verticalSlidesLength = verticalSlides.length;
1699
+
1700
+ // Loops so that it measures 1 between the first and last slides
1701
+ distanceX = Math.abs( ( indexh - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;
1702
+
1703
+ // Show the horizontal slide if it's within the view distance
1704
+ horizontalSlide.style.display = distanceX > viewDistance ? 'none' : 'block';
1705
+
1706
+ if( verticalSlidesLength ) {
1707
+
1708
+ var oy = getPreviousVerticalIndex( horizontalSlide );
1709
+
1710
+ for( var y = 0; y < verticalSlidesLength; y++ ) {
1711
+ var verticalSlide = verticalSlides[y];
1712
+
1713
+ distanceY = x === indexh ? Math.abs( indexv - y ) : Math.abs( y - oy );
1714
+
1715
+ verticalSlide.style.display = ( distanceX + distanceY ) > viewDistance ? 'none' : 'block';
1716
+ }
1717
+
1718
+ }
1719
+ }
1720
+
1721
+ }
1722
+
1723
+ }
1724
+
1550
1725
  /**
1551
1726
  * Updates the progress bar to reflect the current slide.
1552
1727
  */
@@ -1601,48 +1776,45 @@ var Reveal = (function(){
1601
1776
  */
1602
1777
  function updateControls() {
1603
1778
 
1604
- if ( config.controls && dom.controls ) {
1605
-
1606
- var routes = availableRoutes();
1607
- var fragments = availableFragments();
1608
-
1609
- // Remove the 'enabled' class from all directions
1610
- dom.controlsLeft.concat( dom.controlsRight )
1611
- .concat( dom.controlsUp )
1612
- .concat( dom.controlsDown )
1613
- .concat( dom.controlsPrev )
1614
- .concat( dom.controlsNext ).forEach( function( node ) {
1615
- node.classList.remove( 'enabled' );
1616
- node.classList.remove( 'fragmented' );
1617
- } );
1779
+ var routes = availableRoutes();
1780
+ var fragments = availableFragments();
1781
+
1782
+ // Remove the 'enabled' class from all directions
1783
+ dom.controlsLeft.concat( dom.controlsRight )
1784
+ .concat( dom.controlsUp )
1785
+ .concat( dom.controlsDown )
1786
+ .concat( dom.controlsPrev )
1787
+ .concat( dom.controlsNext ).forEach( function( node ) {
1788
+ node.classList.remove( 'enabled' );
1789
+ node.classList.remove( 'fragmented' );
1790
+ } );
1618
1791
 
1619
- // Add the 'enabled' class to the available routes
1620
- if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1621
- if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1622
- if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1623
- if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1792
+ // Add the 'enabled' class to the available routes
1793
+ if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1794
+ if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1795
+ if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1796
+ if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1624
1797
 
1625
- // Prev/next buttons
1626
- if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1627
- if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1798
+ // Prev/next buttons
1799
+ if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1800
+ if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
1628
1801
 
1629
- // Highlight fragment directions
1630
- if( currentSlide ) {
1802
+ // Highlight fragment directions
1803
+ if( currentSlide ) {
1631
1804
 
1632
- // Always apply fragment decorator to prev/next buttons
1633
- if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1634
- if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1805
+ // Always apply fragment decorator to prev/next buttons
1806
+ if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1807
+ if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1635
1808
 
1636
- // Apply fragment decorators to directional buttons based on
1637
- // what slide axis they are in
1638
- if( isVerticalSlide( currentSlide ) ) {
1639
- if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1640
- if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1641
- }
1642
- else {
1643
- if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1644
- if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1645
- }
1809
+ // Apply fragment decorators to directional buttons based on
1810
+ // what slide axis they are in
1811
+ if( isVerticalSlide( currentSlide ) ) {
1812
+ if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1813
+ if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1814
+ }
1815
+ else {
1816
+ if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1817
+ if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
1646
1818
  }
1647
1819
 
1648
1820
  }
@@ -1803,7 +1975,7 @@ var Reveal = (function(){
1803
1975
  }
1804
1976
  // If the slide doesn't exist, navigate to the current slide
1805
1977
  else {
1806
- slide( indexh, indexv );
1978
+ slide( indexh || 0, indexv || 0 );
1807
1979
  }
1808
1980
  }
1809
1981
  else {
@@ -1811,7 +1983,9 @@ var Reveal = (function(){
1811
1983
  var h = parseInt( bits[0], 10 ) || 0,
1812
1984
  v = parseInt( bits[1], 10 ) || 0;
1813
1985
 
1814
- slide( h, v );
1986
+ if( h !== indexh || v !== indexv ) {
1987
+ slide( h, v );
1988
+ }
1815
1989
  }
1816
1990
 
1817
1991
  }
@@ -1888,8 +2062,9 @@ var Reveal = (function(){
1888
2062
  }
1889
2063
 
1890
2064
  if( !slide && currentSlide ) {
1891
- var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );
1892
- if( visibleFragments.length ) {
2065
+ var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;
2066
+ if( hasFragments ) {
2067
+ var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );
1893
2068
  f = visibleFragments.length;
1894
2069
  }
1895
2070
  }
@@ -2119,7 +2294,7 @@ var Reveal = (function(){
2119
2294
 
2120
2295
  var value = config.keyboard[ key ];
2121
2296
 
2122
- // Calback function
2297
+ // Callback function
2123
2298
  if( typeof value === 'function' ) {
2124
2299
  value.apply( null, [ event ] );
2125
2300
  }
@@ -2178,7 +2353,8 @@ var Reveal = (function(){
2178
2353
  if( triggered ) {
2179
2354
  event.preventDefault();
2180
2355
  }
2181
- else if ( event.keyCode === 27 && supports3DTransforms ) {
2356
+ // ESC or O key
2357
+ else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && supports3DTransforms ) {
2182
2358
  toggleOverview();
2183
2359
 
2184
2360
  event.preventDefault();
@@ -2220,11 +2396,11 @@ var Reveal = (function(){
2220
2396
  function onTouchMove( event ) {
2221
2397
 
2222
2398
  // Each touch should only trigger one action
2223
- if( !touch.handled ) {
2399
+ if( !touch.captured ) {
2224
2400
  var currentX = event.touches[0].clientX;
2225
2401
  var currentY = event.touches[0].clientY;
2226
2402
 
2227
- // If the touch started off with two points and still has
2403
+ // If the touch started with two points and still has
2228
2404
  // two active touches; test for the pinch gesture
2229
2405
  if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) {
2230
2406
 
@@ -2240,7 +2416,7 @@ var Reveal = (function(){
2240
2416
  // If the span is larger than the desire amount we've got
2241
2417
  // ourselves a pinch
2242
2418
  if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
2243
- touch.handled = true;
2419
+ touch.captured = true;
2244
2420
 
2245
2421
  if( currentSpan < touch.startSpan ) {
2246
2422
  activateOverview();
@@ -2260,23 +2436,34 @@ var Reveal = (function(){
2260
2436
  deltaY = currentY - touch.startY;
2261
2437
 
2262
2438
  if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
2263
- touch.handled = true;
2439
+ touch.captured = true;
2264
2440
  navigateLeft();
2265
2441
  }
2266
2442
  else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
2267
- touch.handled = true;
2443
+ touch.captured = true;
2268
2444
  navigateRight();
2269
2445
  }
2270
2446
  else if( deltaY > touch.threshold ) {
2271
- touch.handled = true;
2447
+ touch.captured = true;
2272
2448
  navigateUp();
2273
2449
  }
2274
2450
  else if( deltaY < -touch.threshold ) {
2275
- touch.handled = true;
2451
+ touch.captured = true;
2276
2452
  navigateDown();
2277
2453
  }
2278
2454
 
2279
- event.preventDefault();
2455
+ // If we're embedded, only block touch events if they have
2456
+ // triggered an action
2457
+ if( config.embedded ) {
2458
+ if( touch.captured || isVerticalSlide( currentSlide ) ) {
2459
+ event.preventDefault();
2460
+ }
2461
+ }
2462
+ // Not embedded? Block them all to avoid needless tossing
2463
+ // around of the viewport in iOS
2464
+ else {
2465
+ event.preventDefault();
2466
+ }
2280
2467
 
2281
2468
  }
2282
2469
  }
@@ -2293,7 +2480,7 @@ var Reveal = (function(){
2293
2480
  */
2294
2481
  function onTouchEnd( event ) {
2295
2482
 
2296
- touch.handled = false;
2483
+ touch.captured = false;
2297
2484
 
2298
2485
  }
2299
2486
 
@@ -2553,12 +2740,22 @@ var Reveal = (function(){
2553
2740
 
2554
2741
  // Returns true if we're currently on the last slide
2555
2742
  isLastSlide: function() {
2556
- if( currentSlide && currentSlide.classList.contains( '.stack' ) ) {
2557
- return currentSlide.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false;
2558
- }
2559
- else {
2560
- return document.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false;
2743
+ if( currentSlide ) {
2744
+ // Does this slide has next a sibling?
2745
+ if( currentSlide.nextElementSibling ) return false;
2746
+
2747
+ // If it's vertical, does its parent have a next sibling?
2748
+ if( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;
2749
+
2750
+ return true;
2561
2751
  }
2752
+
2753
+ return false;
2754
+ },
2755
+
2756
+ // Checks if reveal.js has been loaded and is ready for use
2757
+ isReady: function() {
2758
+ return loaded;
2562
2759
  },
2563
2760
 
2564
2761
  // Forward event binding to the reveal DOM element