added Tom Marble's slides
authorAndrew Engelbrecht <sudoman@ninthfloor.org>
Sun, 26 Mar 2017 14:51:56 +0000 (10:51 -0400)
committerAndrew Engelbrecht <sudoman@ninthfloor.org>
Sun, 26 Mar 2017 14:51:56 +0000 (10:51 -0400)
97 files changed:
Tom-Marble/Fixing-trust-on-the-Internet.html [new file with mode: 0644]
Tom-Marble/Fixing-trust-on-the-Internet.org [new file with mode: 0644]
Tom-Marble/Fixing-trust-on-the-Internet.tar.xz [new file with mode: 0644]
Tom-Marble/LICENSES/CC-by-sa-4.txt [new file with mode: 0644]
Tom-Marble/LICENSES/GPL-3.txt [new file with mode: 0644]
Tom-Marble/LICENSES/copyleft-next-0.3.1 [new file with mode: 0644]
Tom-Marble/Makefile [new file with mode: 0644]
Tom-Marble/deck.js/CHANGELOG.md [new file with mode: 0644]
Tom-Marble/deck.js/MIT-license.txt [new file with mode: 0644]
Tom-Marble/deck.js/Makefile [new file with mode: 0644]
Tom-Marble/deck.js/README.md [new file with mode: 0644]
Tom-Marble/deck.js/boilerplate.html [new file with mode: 0644]
Tom-Marble/deck.js/core/deck.core.css [new file with mode: 0644]
Tom-Marble/deck.js/core/deck.core.js [new file with mode: 0644]
Tom-Marble/deck.js/core/deck.core.scss [new file with mode: 0755]
Tom-Marble/deck.js/core/print.css [new file with mode: 0644]
Tom-Marble/deck.js/core/print.scss [new file with mode: 0644]
Tom-Marble/deck.js/extensions/goto/deck.goto.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/goto/deck.goto.html [new file with mode: 0644]
Tom-Marble/deck.js/extensions/goto/deck.goto.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/goto/deck.goto.scss [new file with mode: 0755]
Tom-Marble/deck.js/extensions/menu/deck.menu.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/menu/deck.menu.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/menu/deck.menu.scss [new file with mode: 0755]
Tom-Marble/deck.js/extensions/navigation/deck.navigation.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/navigation/deck.navigation.html [new file with mode: 0644]
Tom-Marble/deck.js/extensions/navigation/deck.navigation.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/navigation/deck.navigation.scss [new file with mode: 0755]
Tom-Marble/deck.js/extensions/onepage/deck.onepage.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/onepage/deck.onepage.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/onepage/deck.onepage.scss [new file with mode: 0644]
Tom-Marble/deck.js/extensions/scale/deck.scale.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/scale/deck.scale.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/scale/deck.scale.scss [new file with mode: 0644]
Tom-Marble/deck.js/extensions/status/deck.status.css [new file with mode: 0644]
Tom-Marble/deck.js/extensions/status/deck.status.html [new file with mode: 0644]
Tom-Marble/deck.js/extensions/status/deck.status.js [new file with mode: 0644]
Tom-Marble/deck.js/extensions/status/deck.status.scss [new file with mode: 0755]
Tom-Marble/deck.js/introduction/index.html [new file with mode: 0644]
Tom-Marble/deck.js/jquery.min.js [new file with mode: 0644]
Tom-Marble/deck.js/modernizr.custom.js [new file with mode: 0644]
Tom-Marble/deck.js/test/fixtures/empty.html [new file with mode: 0644]
Tom-Marble/deck.js/test/fixtures/nesteds.html [new file with mode: 0644]
Tom-Marble/deck.js/test/fixtures/standard.html [new file with mode: 0644]
Tom-Marble/deck.js/test/index.html [new file with mode: 0644]
Tom-Marble/deck.js/test/lib/jasmine-html.js [new file with mode: 0755]
Tom-Marble/deck.js/test/lib/jasmine-jquery.js [new file with mode: 0755]
Tom-Marble/deck.js/test/lib/jasmine.css [new file with mode: 0755]
Tom-Marble/deck.js/test/lib/jasmine.js [new file with mode: 0755]
Tom-Marble/deck.js/test/settings.js [new file with mode: 0755]
Tom-Marble/deck.js/test/spec.core.js [new file with mode: 0755]
Tom-Marble/deck.js/test/spec.goto.js [new file with mode: 0644]
Tom-Marble/deck.js/test/spec.menu.js [new file with mode: 0644]
Tom-Marble/deck.js/test/spec.navigation.js [new file with mode: 0644]
Tom-Marble/deck.js/test/spec.scale.js [new file with mode: 0644]
Tom-Marble/deck.js/test/spec.status.js [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/_reset.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/neon.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/neon.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/swiss.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/swiss.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/web-2.0.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/style/web-2.0.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/fade.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/fade.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/horizontal-slide.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/horizontal-slide.scss [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/vertical-slide.css [new file with mode: 0644]
Tom-Marble/deck.js/themes/transition/vertical-slide.scss [new file with mode: 0644]
Tom-Marble/images/CC-by-sa.png [new file with mode: 0644]
Tom-Marble/images/Dont-trust-your-apps.jpg [new file with mode: 0644]
Tom-Marble/images/bitcoin.svg [new file with mode: 0644]
Tom-Marble/images/centralized.jpg [new file with mode: 0644]
Tom-Marble/images/copyleft-next.png [new file with mode: 0644]
Tom-Marble/images/cuddles-qa.jpg [new file with mode: 0644]
Tom-Marble/images/dogecoin.png [new file with mode: 0644]
Tom-Marble/images/ethereum.png [new file with mode: 0644]
Tom-Marble/images/gplv3-127x51.png [new file with mode: 0644]
Tom-Marble/images/logo_hl_new.png [new file with mode: 0644]
Tom-Marble/images/mall_logo1_medium-300x286.png [new file with mode: 0644]
Tom-Marble/images/nyt-p2p.jpg [new file with mode: 0644]
Tom-Marble/images/reef-death.jpg [new file with mode: 0644]
Tom-Marble/images/tm01.png [new file with mode: 0644]
Tom-Marble/images/tm02.png [new file with mode: 0644]
Tom-Marble/images/tm03.png [new file with mode: 0644]
Tom-Marble/images/tm04.png [new file with mode: 0644]
Tom-Marble/images/tm05.png [new file with mode: 0644]
Tom-Marble/images/tm06.png [new file with mode: 0644]
Tom-Marble/images/tm07.png [new file with mode: 0644]
Tom-Marble/images/tm08.png [new file with mode: 0644]
Tom-Marble/images/tm09.png [new file with mode: 0644]
Tom-Marble/images/tm10.png [new file with mode: 0644]
Tom-Marble/images/tm11.png [new file with mode: 0644]
Tom-Marble/images/tm12.png [new file with mode: 0644]
Tom-Marble/images/tm13.png [new file with mode: 0644]
Tom-Marble/images/zcash-logo-gold.png [new file with mode: 0644]
Tom-Marble/src/my-deck.el [new file with mode: 0644]

diff --git a/Tom-Marble/Fixing-trust-on-the-Internet.html b/Tom-Marble/Fixing-trust-on-the-Internet.html
new file mode 100644 (file)
index 0000000..4eb040d
--- /dev/null
@@ -0,0 +1,1111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--[if lt IE 7]> <html class='no-js ie6' lang='en' xmlns='http://www.w3.org/1999/xhtml'> <![endif]-->
+<!--[if IE 7]> <html class='no-js ie7' lang='en' xmlns='http://www.w3.org/1999/xhtml'> <![endif]-->
+<!--[if IE 8]> <html class='no-js ie8' lang='en' xmlns='http://www.w3.org/1999/xhtml'> <![endif]-->
+<!--[if gt IE 8]><!--> <html  lang='en' xmlns='http://www.w3.org/1999/xhtml'> <!--<![endif]-->
+<head>
+<title>Fixing trust on the Internet</title>
+<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
+<meta name='generator' content='Org-mode'/>
+<meta name='author' content='Tom Marble'/>
+
+<link rel='stylesheet' href='deck.js/core/deck.core.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/goto/deck.goto.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/menu/deck.menu.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/navigation/deck.navigation.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/onepage/deck.onepage.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/scale/deck.scale.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/extensions/status/deck.status.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/themes/style/neon.css' type='text/css' />
+<link rel='stylesheet' href='deck.js/themes/transition/fade.css' type='text/css' />
+<script src='deck.js/jquery.min.js' type='text/javascript'></script>
+<script src='deck.js/core/deck.core.js' type='text/javascript'></script>
+<script src='deck.js/modernizr.custom.js' type='text/javascript'></script>
+<script src='deck.js/extensions/goto/deck.goto.js' type='text/javascript'></script>
+<script src='deck.js/extensions/menu/deck.menu.js' type='text/javascript'></script>
+<script src='deck.js/extensions/navigation/deck.navigation.js' type='text/javascript'></script>
+<script src='deck.js/extensions/onepage/deck.onepage.js' type='text/javascript'></script>
+<script src='deck.js/extensions/scale/deck.scale.js' type='text/javascript'></script>
+<script src='deck.js/extensions/status/deck.status.js' type='text/javascript'></script>
+
+<script type='text/javascript'>
+  $(document).ready(function () { $.deck('.slide'); });
+</script>
+
+<style type='text/css'>
+#table-of-contents a {color: inherit;}
+#table-of-contents ul {margin-bottom: 0;}
+#table-of-contents li {padding: 0;}
+
+#preamble, #postamble {left: 5px; width: 100%;}
+#preamble {position: absolute; top: 10px;}
+#postamble {}
+
+#title-slide h1 {
+    position: static; padding: 0;
+    margin-top: 10%;
+    -webkit-transform: none;
+    -moz-transform: none;
+    -ms-transform: none;
+    -o-transform: none;
+    transform: none;
+    font-size: 2em;
+}
+#title-slide h2 {
+    text-align: center;
+    border:none;
+    padding: 0;
+    margin: 5em;
+    font-size: 1.2em;
+}
+.fullscreen {
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    width: 100%;
+    height: auto;
+}
+.pad-right {
+    margin-right: 1em;
+}
+.pad-bottom {
+    margin-bottom: 3em;
+    background: white;
+}
+.z0 { z-index: 0; }
+.z10 { z-index: 10; }
+.z20 { z-index: 20; }
+table.myable {
+  background-color: #ffffff;
+  border-collapse: collapse;
+  border-width: 2px;
+  border-color: #ffcc00;
+  border-style: solid;
+  color: blue;
+}
+table.mytable td, table.mytable th {
+  border-width: 2px;
+  border-color: #ffcc00;
+  border-style: solid;
+  padding: 3px;
+}
+table.mytable thead {
+  background-color: #ffcc00;
+}
+table.quiettable, table.quiettable colgroup, table.quiettable tbody, table.quiettable > th, table.quiettable > tr {
+  border-style: none;
+}
+table.quiettable td {
+  border-style: none;
+  padding: 0 1em;
+}
+table.quiettable thead {
+  border-style: none;
+}
+
+
+</style>
+</head>
+<body>
+<div id='content' class='deck-container'>
+
+<div id='title-slide' class='slide'>
+<h1>Fixing trust on the Internet</h1>
+<h2>Tom Marble &lt;<a href="mailto:tmarble@info9.net">tmarble@info9.net</a>&gt;</h2>
+</div>
+
+
+<div id="slide-1" class="outline-2  slide">
+<h2 id="sec-1">Meta</h2>
+<div class="outline-text-2" id="text-1">
+</div><div id="slide-1-1" class="outline-3">
+<h3 id="sec-1-1">This presentation is <i>already</i> online!</h3>
+<div class="outline-text-3" id="text-1-1">
+</div><div id="slide-1-1-1" class="outline-4">
+<h4 id="sec-1-1-1"><a href="https://info9.net/trust">https://info9.net/trust</a></h4>
+<div class="outline-text-4" id="text-1-1-1">
+</div><ul class="org-ul"><li><a id="sec-1-1-1-1" name="sec-1-1-1-1"></a>Navigation<br  /><ul class="org-ul"><li><a id="sec-1-1-1-1-1" name="sec-1-1-1-1-1"></a><b>→</b> = forward (swipe right)<br  /></li>
+<li><a id="sec-1-1-1-1-2" name="sec-1-1-1-1-2"></a><b>←</b> = back (swipe left)<br  /></li>
+<li><a id="sec-1-1-1-1-3" name="sec-1-1-1-1-3"></a><b>g</b> = goto slide<br  /></li>
+<li><a id="sec-1-1-1-1-4" name="sec-1-1-1-1-4"></a><b>m</b> = menu of all slides (tap)<br  /></li>
+<li><a id="sec-1-1-1-1-5" name="sec-1-1-1-1-5"></a><b>o</b> = one page<br  /></li>
+<li><a id="sec-1-1-1-1-6" name="sec-1-1-1-1-6"></a><b>s</b> = scrollbars<br  /></li></ul>
+</li>
+<li><a id="sec-1-1-1-2" name="sec-1-1-1-2"></a>Source (<a href="https://github.com/cybercode/org-slides">org-mode</a>): <a href="Fixing-trust-on-the-Internet.tar.xz">Fixing-trust-on-the-Internet.tar.xz</a><br  /></li>
+<li><a id="sec-1-1-1-3" name="sec-1-1-1-3"></a>Copyright © 2017 Tom Marble<br  /><div class="outline-text-5" id="text-1-1-1-3">
+<p>
+Licensed under { <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> | <a href="http://creativecommons.org/licenses/by-sa/4.0/">CC-by-sa 4.0</a> | <a href="https://github.com/copyleft-next/copyleft-next">copyleft-next</a> }
+</p>
+<table border="none" cellspacing="0" cellpadding="6" rules="groups" frame="hsides" class="quiettable">
+
+
+<colgroup>
+<col  class="left" />
+
+<col  class="left" />
+
+<col  class="left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="left"><img src="./images/gplv3-127x51.png" alt="gplv3-127x51.png" /></td>
+<td class="left"><img src="./images/CC-by-sa.png" alt="CC-by-sa.png" /></td>
+<td class="left"><img src="./images/copyleft-next.png" alt="copyleft-next.png" /></td>
+</tr>
+</tbody>
+</table>
+</div>
+</li></ul>
+</div>
+</div>
+</div>
+
+<div id="slide-2" class="outline-2  slide">
+<h2 id="sec-2">Software Freedom &amp; Trust</h2>
+<div class="outline-text-2" id="text-2">
+<p>
+Software Freedom is essential to trust the core infrastructure
+that supports our health, safety, and democracy.
+</p>
+</div>
+
+<div id="slide-2-1" class="outline-3">
+<h3 id="sec-2-1">"We need to have confidence in our software, be able to audit it and be able to repair it when we detect vulnerabilities or unwanted functionality like surveillance."</h3>
+<div class="outline-text-3" id="text-2-1">
+<p>
+&#x2013; Karen Sandler <sup><a id="fnr.1" name="fnr.1" class="footref" href="#references">1</a></sup>
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-3" class="outline-2  slide">
+<h2 id="sec-3">Evolution of using software</h2>
+<div class="outline-text-2" id="text-3">
+</div><div id="slide-3-1" class="outline-3">
+<h3 id="sec-3-1">When we gave each computer a name</h3>
+<div class="outline-text-3" id="text-3-1">
+<p>
+$ tar zxf code.tar.gz &amp;&amp; ./configure &amp;&amp; make install
+</p>
+</div>
+</div>
+<div id="slide-3-2" class="outline-3">
+<h3 id="sec-3-2">When we configured computers automatically</h3>
+<div class="outline-text-3" id="text-3-2">
+<p>
+PXE boot, puppet, apt-get install my-favorite-package
+</p>
+</div>
+</div>
+<div id="slide-3-3" class="outline-3">
+<h3 id="sec-3-3">When we moved to the cloud</h3>
+<div class="outline-text-3" id="text-3-3">
+<p>
+Use this prebuilt image
+</p>
+</div>
+</div>
+<div id="slide-3-4" class="outline-3">
+<h3 id="sec-3-4">When we started using containers</h3>
+<div class="outline-text-3" id="text-3-4">
+<p>
+Make slight modifications to a prebuilt image
+</p>
+</div>
+</div>
+<div id="slide-3-5" class="outline-3">
+<h3 id="sec-3-5">Now we are considering lambda functions</h3>
+<div class="outline-text-3" id="text-3-5">
+<p>
+There isn't an OS image anymore: just a function
+</p>
+</div>
+</div>
+<div id="slide-3-6" class="outline-3">
+<h3 id="sec-3-6">Most software is installed from the app store</h3>
+<div class="outline-text-3" id="text-3-6">
+<p>
+Just accept the EULA and device permissions
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-4" class="outline-2  slide">
+<h2 id="sec-4">Copyleft isn't enough</h2>
+<div class="outline-text-2" id="text-4">
+</div><div id="slide-4-1" class="outline-3">
+<h3 id="sec-4-1">Network services software is not conveyed</h3>
+<div class="outline-text-3" id="text-4-1">
+<p>
+Our FLOSS licenses (including copyleft licenses) depend on conveyance.
+</p>
+</div>
+<div id="slide-4-1-1" class="outline-4">
+<h4 id="sec-4-1-1">AGPL</h4>
+<div class="outline-text-4" id="text-4-1-1">
+<p>
+AGPL "fixes" this network loophole, but hasn't been adopted
+for wide use in practice other than proprietary relicensing.
+</p>
+</div>
+</div>
+</div>
+<div id="slide-4-2" class="outline-3">
+<h3 id="sec-4-2">What about AI "algorithms"?</h3>
+<div class="outline-text-3" id="text-4-2">
+<p>
+What is the preferred form of modification when software is derived from data (e.g. machine learning)?
+</p>
+</div>
+</div>
+<div id="slide-4-3" class="outline-3">
+<h3 id="sec-4-3">No one picks a license anyway</h3>
+<div class="outline-text-3" id="text-4-3">
+<p>
+We haven't taught developers to care <sup><a id="fnr.2" name="fnr.2" class="footref" href="#references">2</a></sup>
+</p>
+</div>
+</div>
+<div id="slide-4-4" class="outline-3">
+<h3 id="sec-4-4">Most software is installed from the app store</h3>
+<div class="outline-text-3" id="text-4-4">
+<p>
+We haven't taught end users to care
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-5" class="outline-2  slide">
+<h2 id="sec-5">The fifth freedom</h2>
+<div class="outline-text-2" id="text-5">
+<p>
+Freedom 4: The right to deploy your software on someone else's server
+</p>
+</div>
+
+<div id="slide-5-1" class="outline-3">
+<h3 id="sec-5-1">"Even if you had the source code today you don't know how to increase other people's freedoms by letting them modify your website at runtime. All you have is a bag of tricks that let's people modify your source code and gives them no way to deploy it on your infrastructure."</h3>
+<div class="outline-text-3" id="text-5-1">
+<p>
+&#x2013; r0ml's LCA keynote <sup><a id="fnr.3" name="fnr.3" class="footref" href="#references">3</a></sup>
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-6" class="outline-2  slide">
+<h2 id="sec-6">Essential infrastructure requirements</h2>
+<div class="outline-text-2" id="text-6">
+</div><div id="slide-6-1" class="outline-3">
+<h3 id="sec-6-1">Energy</h3>
+<div class="outline-text-3" id="text-6-1">
+</div><ul class="org-ul"><li><a id="sec-6-1-0-1" name="sec-6-1-0-1"></a>We need energy for computing, yet energy is centralized.<br  /></li>
+<li><a id="sec-6-1-0-2" name="sec-6-1-0-2"></a>Smart meters have an API for the utility, not for end users<br  /></li></ul>
+</div>
+<div id="slide-6-2" class="outline-3">
+<h3 id="sec-6-2">Communications</h3>
+<div class="outline-text-3" id="text-6-2">
+</div><ul class="org-ul"><li><a id="sec-6-2-0-1" name="sec-6-2-0-1"></a>Why isn't there a free phone? It's the proprietary baseband processor.<br  /></li>
+<li><a id="sec-6-2-0-2" name="sec-6-2-0-2"></a>Potential in unlicensed spectrum, Software Defined Radio, Cognitive Radio<br  /></li></ul>
+</div>
+<div id="slide-6-3" class="outline-3">
+<h3 id="sec-6-3">Money</h3>
+<div class="outline-text-3" id="text-6-3">
+</div><ul class="org-ul"><li><a id="sec-6-3-0-1" name="sec-6-3-0-1"></a>Digital forms of money (often) have surveillance opportunities<br  /></li>
+<li><a id="sec-6-3-0-2" name="sec-6-3-0-2"></a>Anonymous transactions (e.g. cash) are increasingly difficult<br  /><div class="outline-text-5" id="text-6-3-0-2">
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+</div>
+</li></ul>
+</div>
+</div>
+<div id="slide-7" class="outline-2  slide">
+<h2 id="sec-7">Peer to peer energy <sup><a id="fnr.4" name="fnr.4" class="footref" href="#references">4</a></sup></h2>
+<div class="outline-text-2" id="text-7">
+
+<div class="figure">
+<p><img src="./images/nyt-p2p.jpg" alt="p2p" align="center" />
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-8" class="outline-2  slide">
+<h2 id="sec-8">Mobile apps</h2>
+<div class="outline-text-2" id="text-8">
+<p>
+<img src="./images/Dont-trust-your-apps.jpg" alt="Dont-trust-your-apps.jpg" class="pad-right" align="left" /> <sup><a id="fnr.5" name="fnr.5" class="footref" href="#references">5</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-9" class="outline-2  slide">
+<h2 id="sec-9">Where is trust now?</h2>
+<div class="outline-text-2" id="text-9">
+<p>
+<img src="./images/centralized.jpg" alt="centralized.jpg" class="pad-right" align="left" /> <sup><a id="fnr.6" name="fnr.6" class="footref" href="#references">6</a></sup>
+</p>
+</div>
+
+<ul class="org-ul"><li><a id="sec-9-0-0-1" name="sec-9-0-0-1"></a>Credit Bureaus<br  /></li>
+<li><a id="sec-9-0-0-2" name="sec-9-0-0-2"></a>eBay (reputation)<br  /></li>
+<li><a id="sec-9-0-0-3" name="sec-9-0-0-3"></a>other walled gardens<br  /><div class="outline-text-5" id="text-9-0-0-3">
+<p>
+&#x2026;
+</p>
+
+<p>
+Closed and centralized
+</p>
+</div>
+</li></ul>
+</div>
+
+<div id="slide-10" class="outline-2  slide">
+<h2 id="sec-10">Shape of the solution (part 1/2)</h2>
+<div class="outline-text-2" id="text-10">
+<p>
+Network service trust API
+</p>
+</div>
+
+<div id="slide-10-1" class="outline-3">
+<h3 id="sec-10-1">☙ Federated corroboration of assertions</h3>
+<div class="outline-text-3" id="text-10-1">
+<p>
+Harder to corrupt
+</p>
+</div>
+</div>
+<div id="slide-10-2" class="outline-3">
+<h3 id="sec-10-2">☙ Make and query assertions at the app level</h3>
+<div class="outline-text-3" id="text-10-2">
+<p>
+libtrust.so, libtrust.js
+</p>
+</div>
+</div>
+<div id="slide-10-3" class="outline-3">
+<h3 id="sec-10-3">☙ Transitive with personal vantage point</h3>
+<div class="outline-text-3" id="text-10-3">
+</div><ul class="org-ul"><li><a id="sec-10-3-0-1" name="sec-10-3-0-1"></a>Deb asserts the software is Free and reproducible<br  /></li>
+<li><a id="sec-10-3-0-2" name="sec-10-3-0-2"></a>Chris trusts Deb to certify software<br  /></li>
+<li><a id="sec-10-3-0-3" name="sec-10-3-0-3"></a>I trust Chris' software certification assessments<br  /></li>
+<li><a id="sec-10-3-0-4" name="sec-10-3-0-4"></a>⇒ I am comfortable installing this software<br  /></li></ul>
+</div>
+<div id="slide-10-4" class="outline-3">
+<h3 id="sec-10-4">☙ Quick transactions</h3>
+</div>
+</div>
+
+<div id="slide-11" class="outline-2  slide">
+<h2 id="sec-11">You think you know what I'm going to say now&#x2026;</h2>
+</div>
+
+<div id="slide-12" class="outline-2  slide">
+<h2 id="sec-12">13</h2>
+<div class="outline-text-2" id="text-12">
+
+<div class="figure">
+<p><img src="./images/tm13.png" alt="tm13.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-13" class="outline-2  slide">
+<h2 id="sec-13">12</h2>
+<div class="outline-text-2" id="text-13">
+
+<div class="figure">
+<p><img src="./images/tm12.png" alt="tm12.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-14" class="outline-2  slide">
+<h2 id="sec-14">11</h2>
+<div class="outline-text-2" id="text-14">
+
+<div class="figure">
+<p><img src="./images/tm11.png" alt="tm11.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-15" class="outline-2  slide">
+<h2 id="sec-15">10</h2>
+<div class="outline-text-2" id="text-15">
+
+<div class="figure">
+<p><img src="./images/tm10.png" alt="tm10.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-16" class="outline-2  slide">
+<h2 id="sec-16">9</h2>
+<div class="outline-text-2" id="text-16">
+
+<div class="figure">
+<p><img src="./images/tm09.png" alt="tm09.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-17" class="outline-2  slide">
+<h2 id="sec-17">8</h2>
+<div class="outline-text-2" id="text-17">
+
+<div class="figure">
+<p><img src="./images/tm08.png" alt="tm08.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-18" class="outline-2  slide">
+<h2 id="sec-18">7</h2>
+<div class="outline-text-2" id="text-18">
+
+<div class="figure">
+<p><img src="./images/tm07.png" alt="tm07.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-19" class="outline-2  slide">
+<h2 id="sec-19">6</h2>
+<div class="outline-text-2" id="text-19">
+
+<div class="figure">
+<p><img src="./images/tm06.png" alt="tm06.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-20" class="outline-2  slide">
+<h2 id="sec-20">5</h2>
+<div class="outline-text-2" id="text-20">
+
+<div class="figure">
+<p><img src="./images/tm05.png" alt="tm05.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-21" class="outline-2  slide">
+<h2 id="sec-21">4</h2>
+<div class="outline-text-2" id="text-21">
+
+<div class="figure">
+<p><img src="./images/tm04.png" alt="tm04.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-22" class="outline-2  slide">
+<h2 id="sec-22">3</h2>
+<div class="outline-text-2" id="text-22">
+
+<div class="figure">
+<p><img src="./images/tm03.png" alt="tm03.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-23" class="outline-2  slide">
+<h2 id="sec-23">2</h2>
+<div class="outline-text-2" id="text-23">
+
+<div class="figure">
+<p><img src="./images/tm02.png" alt="tm02.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-24" class="outline-2  slide">
+<h2 id="sec-24">1</h2>
+<div class="outline-text-2" id="text-24">
+
+<div class="figure">
+<p><img src="./images/tm01.png" alt="tm01.png" class="fullscreen" />
+</p>
+</div>
+</div>
+</div>
+<div id="slide-25" class="outline-2  slide">
+<h2 id="sec-25">GPG WoT</h2>
+<div class="outline-text-2" id="text-25">
+<p>
+nah :(
+</p>
+</div>
+
+<div id="slide-25-1" class="outline-3">
+<h3 id="sec-25-1">The GPG Web of Trust asserts identity</h3>
+<div class="outline-text-3" id="text-25-1">
+</div><ul class="org-ul"><li><a id="sec-25-1-0-1" name="sec-25-1-0-1"></a>The trustdb is private<br  /></li>
+<li><a id="sec-25-1-0-2" name="sec-25-1-0-2"></a>Keyservers are not designed for other data<br  /></li></ul>
+</div>
+<div id="slide-25-2" class="outline-3">
+<h3 id="sec-25-2">Using PGP is tricky for us</h3>
+<div class="outline-text-3" id="text-25-2">
+</div><ul class="org-ul"><li><a id="sec-25-2-0-1" name="sec-25-2-0-1"></a>Choosing algos and signature strengths<br  /></li>
+<li><a id="sec-25-2-0-2" name="sec-25-2-0-2"></a>Protecting key material<br  /></li>
+<li><a id="sec-25-2-0-3" name="sec-25-2-0-3"></a>Not getting fooled by EVIL-32 <sup><a id="fnr.7" name="fnr.7" class="footref" href="#references">7</a></sup><br  /></li></ul>
+</div>
+<div id="slide-25-3" class="outline-3">
+<h3 id="sec-25-3">Impossibly difficult for end users</h3>
+<div class="outline-text-3" id="text-25-3">
+</div><ul class="org-ul"><li><a id="sec-25-3-0-1" name="sec-25-3-0-1"></a>Sharing public keys<br  /></li>
+<li><a id="sec-25-3-0-2" name="sec-25-3-0-2"></a>Configuring applications properly<br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-26" class="outline-2  slide">
+<h2 id="sec-26">You think you know what I'm going to say NOW&#x2026;</h2>
+</div>
+
+<div id="slide-27" class="outline-2  slide">
+<h2 id="sec-27">Bitcoin</h2>
+<div class="outline-text-2" id="text-27">
+
+<div class="figure">
+<p><img src="./images/bitcoin.svg" alt="bitcoin.svg" class="pad-bottom" height="300px" />
+</p>
+</div>
+
+<p>
+In Satoshi Nakamoto we trust! <sup><a id="fnr.8" name="fnr.8" class="footref" href="#references">8</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-28" class="outline-2  slide">
+<h2 id="sec-28">Hyperledger</h2>
+<div class="outline-text-2" id="text-28">
+
+<div class="figure">
+<p><img src="./images/logo_hl_new.png" alt="logo_hl_new.png" class="pad-bottom" />
+</p>
+</div>
+
+<p>
+It's hosted by the Linux Foundation. That means it's community friendly&#x2026; rite? <sup><a id="fnr.9" name="fnr.9" class="footref" href="#references">9</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-29" class="outline-2  slide">
+<h2 id="sec-29">Ethereum</h2>
+<div class="outline-text-2" id="text-29">
+
+<div class="figure">
+<p><img src="./images/ethereum.png" alt="ethereum.png" class="pad-bottom" />
+</p>
+</div>
+
+<p>
+Companies use it for smart contracts! <sup><a id="fnr.10" name="fnr.10" class="footref" href="#references">10</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-30" class="outline-2  slide">
+<h2 id="sec-30">Zcash</h2>
+<div class="outline-text-2" id="text-30">
+
+<div class="figure">
+<p><img src="./images/zcash-logo-gold.png" alt="zcash-logo-gold.png" class="pad-bottom" />
+</p>
+</div>
+
+<p>
+Zooko and Matthew Green <sup><a id="fnr.11" name="fnr.11" class="footref" href="#references">11</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-31" class="outline-2  slide">
+<h2 id="sec-31">DogeCoin</h2>
+<div class="outline-text-2" id="text-31">
+
+<div class="figure">
+<p><img src="./images/dogecoin.png" alt="dogecoin.png" class="pad-bottom" />
+</p>
+</div>
+
+<p>
+That's the MEME! <sup><a id="fnr.12" name="fnr.12" class="footref" href="#references">12</a></sup>
+</p>
+</div>
+</div>
+
+<div id="slide-32" class="outline-2  slide">
+<h2 id="sec-32">nah :(</h2>
+<div class="outline-text-2" id="text-32">
+<p>
+Wait, why NOT blockchain tech?
+</p>
+</div>
+<div id="slide-32-1" class="outline-3">
+<h3 id="sec-32-1">centralized &#x2013; in effect</h3>
+<div class="outline-text-3" id="text-32-1">
+<p>
+Domination by huge mining pools
+</p>
+</div>
+</div>
+<div id="slide-32-2" class="outline-3">
+<h3 id="sec-32-2">bandwidth limited</h3>
+<div class="outline-text-3" id="text-32-2">
+<p>
+Time to process transactions long and variable
+</p>
+</div>
+</div>
+<div id="slide-32-3" class="outline-3">
+<h3 id="sec-32-3">transaction fees</h3>
+<div class="outline-text-3" id="text-32-3">
+<p>
+Start to look like PayPal fees
+</p>
+</div>
+</div>
+<div id="slide-32-4" class="outline-3">
+<h3 id="sec-32-4">a waste of energy</h3>
+<div class="outline-text-3" id="text-32-4">
+<p>
+Brute forcing hashes is bad <sup><a id="fnr.13" name="fnr.13" class="footref" href="#references">13</a></sup> for the environment <sup><a id="fnr.14" name="fnr.14" class="footref" href="#references">14</a></sup>
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-33" class="outline-2  slide">
+<h2 id="sec-33">Great barrier reef</h2>
+<div class="outline-text-2" id="text-33">
+<table border="none" cellspacing="0" cellpadding="6" rules="groups" frame="hsides" class="quiettable">
+
+
+<colgroup>
+<col  class="left" />
+
+<col  class="left" />
+
+<col  class="left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="left">not fake news</td>
+<td class="left"><img src="./images/reef-death.jpg" alt="reef-death.jpg" /></td>
+<td class="left"><sup><a id="fnr.15" name="fnr.15" class="footref" href="#references">15</a></sup></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+
+<div id="slide-34" class="outline-2  slide">
+<h2 id="sec-34">What we need is..</h2>
+<div class="outline-text-2" id="text-34">
+<p>
+What's the essential thing the blockchain solves
+</p>
+</div>
+
+<div id="slide-34-1" class="outline-3">
+<h3 id="sec-34-1">non-repudiation</h3>
+</div>
+</div>
+
+<div id="slide-35" class="outline-2  slide">
+<h2 id="sec-35">Learn by example</h2>
+<div class="outline-text-2" id="text-35">
+
+<div class="figure">
+<p><img src="./images/mall_logo1_medium-300x286.png" alt="mall_logo1_medium-300x286.png" class="pad-right" align="left" />
+</p>
+</div>
+</div>
+
+<ul class="org-ul"><li><a id="sec-35-0-0-1" name="sec-35-0-0-1"></a>The tire fire that is X.509 <sup><a id="fnr.16" name="fnr.16" class="footref" href="#references">16</a></sup><br  /></li>
+<li><a id="sec-35-0-0-2" name="sec-35-0-0-2"></a>MiTM on the internet <sup><a id="fnr.17" name="fnr.17" class="footref" href="#references">17</a></sup><br  /><ul class="org-ul"><li><a id="sec-35-0-0-2-1" name="sec-35-0-0-2-1"></a>4.0% of Firefox update connections<br  /></li>
+<li><a id="sec-35-0-0-2-2" name="sec-35-0-0-2-2"></a>6.2% of e-commerce connections<br  /></li>
+<li><a id="sec-35-0-0-2-3" name="sec-35-0-0-2-3"></a>10.9% of U.S. Cloudflare connections<br  /></li></ul>
+</li></ul>
+</div>
+
+<div id="slide-36" class="outline-2  slide">
+<h2 id="sec-36">Certificate Transparency</h2>
+<div class="outline-text-2" id="text-36">
+</div><div id="slide-36-1" class="outline-3">
+<h3 id="sec-36-1">Use append-only logs to record certificate signatures <sup><a id="fnr.18" name="fnr.18" class="footref" href="#references">18</a></sup></h3>
+<div class="outline-text-3" id="text-36-1">
+</div><ul class="org-ul"><li><a id="sec-36-1-0-1" name="sec-36-1-0-1"></a>Early detection of misissued certificates, malicious certificates, and rogue CAs.<br  /></li>
+<li><a id="sec-36-1-0-2" name="sec-36-1-0-2"></a>Faster mitigation after suspect certificates or CAs are detected.<br  /></li>
+<li><a id="sec-36-1-0-3" name="sec-36-1-0-3"></a>Better oversight of the entire TLS/SSL system.<br  /></li></ul>
+</div>
+<div id="slide-36-2" class="outline-3">
+<h3 id="sec-36-2">Browser support</h3>
+<div class="outline-text-3" id="text-36-2">
+</div><ul class="org-ul"><li><a id="sec-36-2-0-1" name="sec-36-2-0-1"></a>Chrome <sup><a id="fnr.19" name="fnr.19" class="footref" href="#references">19</a></sup><br  /></li>
+<li><a id="sec-36-2-0-2" name="sec-36-2-0-2"></a>Firefox <sup><a id="fnr.20" name="fnr.20" class="footref" href="#references">20</a></sup><br  /></li></ul>
+</div>
+<div id="slide-36-3" class="outline-3">
+<h3 id="sec-36-3">Ongoing concerns and discussion <sup><a id="fnr.21" name="fnr.21" class="footref" href="#references">21</a></sup></h3>
+<div class="outline-text-3" id="text-36-3">
+</div><ul class="org-ul"><li><a id="sec-36-3-0-1" name="sec-36-3-0-1"></a>RFC 6962 <sup><a id="fnr.22" name="fnr.22" class="footref" href="#references">22</a></sup><br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-37" class="outline-2  slide">
+<h2 id="sec-37">Append-only logs</h2>
+<div class="outline-text-2" id="text-37">
+</div><div id="slide-37-1" class="outline-3">
+<h3 id="sec-37-1">Merkle Trees <sup><a id="fnr.23" name="fnr.23" class="footref" href="#references">23</a></sup></h3>
+<div class="outline-text-3" id="text-37-1">
+<p>
+Tree of hashes, provides log(n) performance
+</p>
+</div>
+</div>
+<div id="slide-37-2" class="outline-3">
+<h3 id="sec-37-2">eXtended Merkle Signature Scheme (XMSS) <sup><a id="fnr.24" name="fnr.24" class="footref" href="#references">24</a></sup></h3>
+<div class="outline-text-3" id="text-37-2">
+<p>
+Requires maintaining state (not portable)
+</p>
+</div>
+</div>
+<div id="slide-37-3" class="outline-3">
+<h3 id="sec-37-3">SPHINCS <sup><a id="fnr.25" name="fnr.25" class="footref" href="#references">25</a></sup></h3>
+<div class="outline-text-3" id="text-37-3">
+<p>
+Stateless <sup><a id="fnr.26" name="fnr.26" class="footref" href="#references">26</a></sup>
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-38" class="outline-2  slide">
+<h2 id="sec-38">Generic use of append-only logs</h2>
+<div class="outline-text-2" id="text-38">
+</div><div id="slide-38-1" class="outline-3">
+<h3 id="sec-38-1">Trillian <sup><a id="fnr.27" name="fnr.27" class="footref" href="#references">27</a></sup></h3>
+<div class="outline-text-3" id="text-38-1">
+<p>
+Merkle tree based
+</p>
+</div>
+</div>
+<div id="slide-38-2" class="outline-3">
+<h3 id="sec-38-2">Cothority <sup><a id="fnr.28" name="fnr.28" class="footref" href="#references">28</a></sup></h3>
+<div class="outline-text-3" id="text-38-2">
+<p>
+Multi-party cryptographic signatures to avoid backdoors
+</p>
+</div>
+</div>
+<div id="slide-38-3" class="outline-3">
+<h3 id="sec-38-3">Codehash <sup><a id="fnr.29" name="fnr.29" class="footref" href="#references">29</a></sup></h3>
+<div class="outline-text-3" id="text-38-3">
+<p>
+A simple oracle that answers a simple question: is this software safe to install and run? <sup><a id="fnr.30" name="fnr.30" class="footref" href="#references">30</a></sup>
+</p>
+</div>
+</div>
+</div>
+
+<div id="slide-39" class="outline-2  slide">
+<h2 id="sec-39">Challenges</h2>
+<div class="outline-text-2" id="text-39">
+</div><div id="slide-39-1" class="outline-3">
+<h3 id="sec-39-1">Toxic Data</h3>
+<div class="outline-text-3" id="text-39-1">
+</div><ul class="org-ul"><li><a id="sec-39-1-0-1" name="sec-39-1-0-1"></a>Allow deletion? Possible vulnerabilities in allowing log altering<br  /></li>
+<li><a id="sec-39-1-0-2" name="sec-39-1-0-2"></a>Prohibit deletion? Permanent toxicity: no way to be forgotten<br  /></li></ul>
+</div>
+<div id="slide-39-2" class="outline-3">
+<h3 id="sec-39-2">Spam</h3>
+<div class="outline-text-3" id="text-39-2">
+</div><ul class="org-ul"><li><a id="sec-39-2-0-1" name="sec-39-2-0-1"></a>Open log with arbitrary input data?<br  /></li>
+<li><a id="sec-39-2-0-2" name="sec-39-2-0-2"></a>vs. CT only allowing root authorities?<br  /></li></ul>
+</div>
+<div id="slide-39-3" class="outline-3">
+<h3 id="sec-39-3">Astroturfing</h3>
+<div class="outline-text-3" id="text-39-3">
+</div><ul class="org-ul"><li><a id="sec-39-3-0-1" name="sec-39-3-0-1"></a>Can the network be overwhelmed?<br  /></li>
+<li><a id="sec-39-3-0-2" name="sec-39-3-0-2"></a>vs. Is the personal vantage point immune?<br  /></li></ul>
+</div>
+<div id="slide-39-4" class="outline-3">
+<h3 id="sec-39-4">Writing crypto safe code is difficult</h3>
+</div>
+</div>
+
+<div id="slide-40" class="outline-2  slide">
+<h2 id="sec-40">Best Practices</h2>
+<div class="outline-text-2" id="text-40">
+</div><div id="slide-40-1" class="outline-3">
+<h3 id="sec-40-1">Free Software with Complete and Corresponding Source</h3>
+</div>
+<div id="slide-40-2" class="outline-3">
+<h3 id="sec-40-2">Code review</h3>
+<div class="outline-text-3" id="text-40-2">
+</div><ul class="org-ul"><li><a id="sec-40-2-0-1" name="sec-40-2-0-1"></a>Avoid the OpenSSL problem<br  /></li></ul>
+</div>
+<div id="slide-40-3" class="outline-3">
+<h3 id="sec-40-3">Reproducible builds</h3>
+</div>
+<div id="slide-40-4" class="outline-3">
+<h3 id="sec-40-4">Automated, Continuous integration</h3>
+<div class="outline-text-3" id="text-40-4">
+</div><ul class="org-ul"><li><a id="sec-40-4-0-1" name="sec-40-4-0-1"></a>static analysis (ASAN)<br  /></li>
+<li><a id="sec-40-4-0-2" name="sec-40-4-0-2"></a>coverage<br  /></li>
+<li><a id="sec-40-4-0-3" name="sec-40-4-0-3"></a>fuzzing<br  /></li>
+<li><a id="sec-40-4-0-4" name="sec-40-4-0-4"></a>tests against threats<br  /></li></ul>
+</div>
+<div id="slide-40-5" class="outline-3">
+<h3 id="sec-40-5">As a developer you do NOT want to be a target</h3>
+<div class="outline-text-3" id="text-40-5">
+</div><ul class="org-ul"><li><a id="sec-40-5-0-1" name="sec-40-5-0-1"></a>want to do be right by your users<br  /></li>
+<li><a id="sec-40-5-0-2" name="sec-40-5-0-2"></a>the checks &amp; balances keep developers from being vulnerable<br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-41" class="outline-2  slide">
+<h2 id="sec-41">Shape of the solution (part 2/2)</h2>
+<div class="outline-text-2" id="text-41">
+</div><div id="slide-41-1" class="outline-3">
+<h3 id="sec-41-1">Research similar work</h3>
+<div class="outline-text-3" id="text-41-1">
+</div><ul class="org-ul"><li><a id="sec-41-1-0-1" name="sec-41-1-0-1"></a>append-only log alternatives<br  /></li>
+<li><a id="sec-41-1-0-2" name="sec-41-1-0-2"></a>Application Transparency<br  /></li>
+<li><a id="sec-41-1-0-3" name="sec-41-1-0-3"></a>Binary Transparency <sup><a id="fnr.31" name="fnr.31" class="footref" href="#references">31</a></sup><br  /></li></ul>
+</div>
+<div id="slide-41-2" class="outline-3">
+<h3 id="sec-41-2">Address the Challenges</h3>
+</div>
+<div id="slide-41-3" class="outline-3">
+<h3 id="sec-41-3">Use Best Practices</h3>
+</div>
+<div id="slide-41-4" class="outline-3">
+<h3 id="sec-41-4">Under the umbrella of a fiscal sponsorship organization</h3>
+<div class="outline-text-3" id="text-41-4">
+</div><ul class="org-ul"><li><a id="sec-41-4-0-1" name="sec-41-4-0-1"></a>Governance review<br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-42" class="outline-2  slide">
+<h2 id="sec-42">Software Freedom Conservancy</h2>
+<div class="outline-text-2" id="text-42">
+<p>
+Why you should support Conservancy:
+</p>
+</div>
+
+<div id="slide-42-1" class="outline-3">
+<h3 id="sec-42-1">🌲 supports diversity and is home to Outreachy <sup><a id="fnr.32" name="fnr.32" class="footref" href="#references">32</a></sup></h3>
+</div>
+<div id="slide-42-2" class="outline-3">
+<h3 id="sec-42-2">🌲 helps hackers: ContractPatch <sup><a id="fnr.33" name="fnr.33" class="footref" href="#references">33</a></sup></h3>
+</div>
+<div id="slide-42-3" class="outline-3">
+<h3 id="sec-42-3">🌲 is a 501(c)3 charity supported by individuals <sup><a id="fnr.34" name="fnr.34" class="footref" href="#references">34</a></sup></h3>
+<div class="outline-text-3" id="text-42-3">
+</div><div id="slide-42-3-1" class="outline-4">
+<h4 id="sec-42-3-1">Please join today!</h4>
+<div class="outline-text-4" id="text-42-3-1">
+<p>
+<a href="https://sfconservancy.org/">https://sfconservancy.org/</a>
+</p>
+
+<p>
+<b>disclaimer: I'm on the Conservancy Evaluation Committee</b>
+</p>
+</div>
+</div>
+</div>
+</div>
+
+<div id="slide-43" class="outline-2  slide">
+<h2 id="sec-43">Possible first use case: Debian</h2>
+<div class="outline-text-2" id="text-43">
+<p>
+Protect against compromised repositories
+</p>
+</div>
+
+<div id="slide-43-1" class="outline-3">
+<h3 id="sec-43-1">On package publication (by the Debian project)</h3>
+<div class="outline-text-3" id="text-43-1">
+</div><ul class="org-ul"><li><a id="sec-43-1-0-1" name="sec-43-1-0-1"></a>put package signature into an append-only log<br  /></li></ul>
+</div>
+<div id="slide-43-2" class="outline-3">
+<h3 id="sec-43-2">On package installation (by the user, via apt-get plugin)</h3>
+<div class="outline-text-3" id="text-43-2">
+</div><ul class="org-ul"><li><a id="sec-43-2-0-1" name="sec-43-2-0-1"></a>verify package signatures with the log<br  /></li>
+<li><a id="sec-43-2-0-2" name="sec-43-2-0-2"></a>publish suspicious checksum to an auditor<br  /></li>
+<li><a id="sec-43-2-0-3" name="sec-43-2-0-3"></a>option to not install mismatched packages<br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-44" class="outline-2  slide">
+<h2 id="sec-44">Why talk trust at LibrePlanet?</h2>
+<div class="outline-text-2" id="text-44">
+</div><div id="slide-44-1" class="outline-3">
+<h3 id="sec-44-1">Because of the people in this room!</h3>
+<div class="outline-text-3" id="text-44-1">
+</div><ul class="org-ul"><li><a id="sec-44-1-0-1" name="sec-44-1-0-1"></a>We understand the tech<br  /></li>
+<li><a id="sec-44-1-0-2" name="sec-44-1-0-2"></a>We understand why trust matters to end users<br  /></li>
+<li><a id="sec-44-1-0-3" name="sec-44-1-0-3"></a>We are the peer reviewers<br  /></li></ul>
+</div>
+<div id="slide-44-2" class="outline-3">
+<h3 id="sec-44-2">Need to reach more than just developers&#x2026;</h3>
+<div class="outline-text-3" id="text-44-2">
+</div><ul class="org-ul"><li><a id="sec-44-2-0-1" name="sec-44-2-0-1"></a>User experience experts<br  /></li>
+<li><a id="sec-44-2-0-2" name="sec-44-2-0-2"></a>Lawyers: How to reprise the "hack on copyright" to protect network services<br  /></li>
+<li><a id="sec-44-2-0-3" name="sec-44-2-0-3"></a>Activists: Help end users understand and care!<br  /></li></ul>
+</div>
+</div>
+
+<div id="slide-45" class="outline-2  slide">
+<h2 id="sec-45">Q/A &amp; Where we go from here</h2>
+<div class="outline-text-2" id="text-45">
+</div><div id="slide-45-1" class="outline-3">
+<h3 id="sec-45-1">Call to action: Join the [trust-api] mailing list</h3>
+<div class="outline-text-3" id="text-45-1">
+<p>
+<a href="http://lists.info9.net/mailman/listinfo/trust-api">http://lists.info9.net/mailman/listinfo/trust-api</a>
+</p>
+</div>
+</div>
+<div id="slide-45-2" class="outline-3">
+<h3 id="sec-45-2">Cuddles asks a question??? <sup><a id="fnr.35" name="fnr.35" class="footref" href="#references">35</a></sup></h3>
+<div class="outline-text-3" id="text-45-2">
+
+<div class="figure">
+<p><img src="./images/cuddles-qa.jpg" alt="Cuddles" align="center" />
+</p>
+</div>
+</div>
+</div>
+</div>
+
+<div id="references" class="outline-2  slide">
+<h2 id="sec-46">References</h2>
+<div class="outline-text-2" id="text-46">
+<p>
+Footnote references (press 's' for scrollbars)
+</p>
+<input type="button" value="◁" onclick="window.history.back()"/>
+<ol>
+
+<li id="fn:1"> <a href="https://sfconservancy.org/blog/2016/dec/29/software-freedom-after-trump/">https://sfconservancy.org/blog/2016/dec/29/software-freedom-after-trump/</a>
+
+<li id="fn:2"> See 48:35 in r0ml's talk on how the minority of GitHub projects actually have a license:
+<a href="https://www.youtube.com/watch?v=i3nJR7PNgI4&feature=youtu.be&t=2915">https://www.youtube.com/watch?v=i3nJR7PNgI4&feature=youtu.be&t=2915</a>
+
+<li id="fn:3"> <a href="https://www.youtube.com/watch?v=i3nJR7PNgI4">https://www.youtube.com/watch?v=i3nJR7PNgI4</a>
+
+<li id="fn:4"> <a href="https://www.nytimes.com/2017/03/13/business/energy-environment/brooklyn-solar-grid-energy-trading.html">https://www.nytimes.com/2017/03/13/business/energy-environment/brooklyn-solar-grid-energy-trading.html</a>
+
+<li id="fn:5"> <a href="http://www.usatoday.com/story/tech/news/2017/03/06/mapping-software-routing-waze-google-traffic-calming-algorithmsi/98588980/">http://www.usatoday.com/story/tech/news/2017/03/06/mapping-software-routing-waze-google-traffic-calming-algorithmsi/98588980/</a>
+
+<li id="fn:6"> <a href="https://archive.fosdem.org/2014/schedule/event/network_freedom/">https://archive.fosdem.org/2014/schedule/event/network_freedom/</a>
+
+<li id="fn:7"> <a href="https://evil32.com/">https://evil32.com/</a>
+
+<li id="fn:8"> <a href="https://bitcoin.org/en/">https://bitcoin.org/en/</a>
+
+<li id="fn:9"> <a href="https://www.hyperledger.org/">https://www.hyperledger.org/</a>
+
+<li id="fn:10"> <a href="https://www.ethereum.org/">https://www.ethereum.org/</a>
+
+<li id="fn:11"> <a href="https://z.cash/">https://z.cash/</a>
+
+<li id="fn:12"> <a href="http://dogecoin.com/">http://dogecoin.com/</a>
+
+<li id="fn:13"> <a href="http://www.abc.net.au/news/2015-10-06/quiggin-bitcoins-are-a-waste-of-energy/6827940">http://www.abc.net.au/news/2015-10-06/quiggin-bitcoins-are-a-waste-of-energy/6827940</a>
+
+<li id="fn:14"> <a href="https://www.bitcoinmining.com/is-bitcoin-mining-waste-electricity/">https://www.bitcoinmining.com/is-bitcoin-mining-waste-electricity/</a>
+
+<li id="fn:15"> <a href="http://www.news.com.au/technology/environment/natural-wonders/before-and-after-great-barrier-reef-photos-expose-shocking-realities-of-coral-bleaching/news-story/527d7599f160532474b27f1ca26fdbfc">http://www.news.com.au/technology/environment/natural-wonders/before-and-after-great-barrier-reef-photos-expose-shocking-realities-of-coral-bleaching/news-story/527d7599f160532474b27f1ca26fdbfc</a>
+
+<li id="fn:16"> Security Now, Epsiode #599
+<a href="https://www.grc.com/securitynow.htm">https://www.grc.com/securitynow.htm</a>
+
+<li id="fn:17"> <a href="https://jhalderm.com/pub/papers/interception-ndss17.pdf">https://jhalderm.com/pub/papers/interception-ndss17.pdf</a>
+
+<li id="fn:18"> <a href="https://www.certificate-transparency.org/">https://www.certificate-transparency.org/</a>
+
+<li id="fn:19"> <a href="https://www.thesslstore.com/blog/google-chrome-certificate-transparency-2017/">https://www.thesslstore.com/blog/google-chrome-certificate-transparency-2017/</a>
+
+<li id="fn:20"> <a href="https://www.thesslstore.com/blog/firefox-certificate-transparency/">https://www.thesslstore.com/blog/firefox-certificate-transparency/</a>
+
+<li id="fn:21"> <a href="https://www.ietf.org/mailman/listinfo/trans">https://www.ietf.org/mailman/listinfo/trans</a>
+
+<li id="fn:22"> <a href="https://datatracker.ietf.org/doc/rfc6962/">https://datatracker.ietf.org/doc/rfc6962/</a>
+
+<li id="fn:23"> <a href="https://en.wikipedia.org/wiki/Merkle_tree">https://en.wikipedia.org/wiki/Merkle_tree</a>
+
+<li id="fn:24"> <a href="https://eprint.iacr.org/2011/484.pdf">https://eprint.iacr.org/2011/484.pdf</a>
+
+<li id="fn:25"> <a href="https://sphincs.cr.yp.to/">https://sphincs.cr.yp.to/</a>
+
+<li id="fn:26"> <a href="https://cryptoservices.github.io/quantum/2015/12/08/XMSS-and-SPHINCS.html">https://cryptoservices.github.io/quantum/2015/12/08/XMSS-and-SPHINCS.html</a>
+
+<li id="fn:27"> <a href="https://github.com/google/trillian">https://github.com/google/trillian</a>
+
+<li id="fn:28"> <a href="https://boingboing.net/2016/03/10/using-distributed-code-signatu.html">https://boingboing.net/2016/03/10/using-distributed-code-signatu.html</a>
+
+<li id="fn:29"> <a href="https://github.com/rootkovska/codehash.db">https://github.com/rootkovska/codehash.db</a>
+
+<li id="fn:30"> <a href="https://secure-os.org/pipermail/desktops/2016-November/000143.html">https://secure-os.org/pipermail/desktops/2016-November/000143.html</a>
+
+<li id="fn:31"> <a href="https://github.com/FreeBSDFoundation/binary-transparency-notes">https://github.com/FreeBSDFoundation/binary-transparency-notes</a>
+
+<li id="fn:32"> <a href="https://www.gnome.org/outreachy/">https://www.gnome.org/outreachy/</a>
+
+<li id="fn:33"> <a href="https://sfconservancy.org/blog/?tag=ContractPatch">https://sfconservancy.org/blog/?tag=ContractPatch</a>
+
+<li id="fn:34"> <a href="https://sfconservancy.org/supporter/">https://sfconservancy.org/supporter/</a>
+
+<li id="fn:35"> cuddles: Copyright © 2017 Tom Marble, CC-by-sa 4.0</ol>
+</div>
+</div>
+
+
+<!-- Place the following snippet at the bottom of the deck container. -->
+<p class="deck-status" aria-role="status">
+  <span class="deck-status-current"></span>
+  /
+  <span class="deck-status-total"></span>
+</p>
+
+<!-- Place the following snippet at the bottom of the deck container. -->
+<div aria-role="navigation">
+  <a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
+  <a href="#" class="deck-next-link" title="Next">&#8594;</a>
+</div>
+
+<!-- Place the following snippet at the bottom of the deck container. -->
+<form action="." method="get" class="goto-form">
+  <label for="goto-slide">Go to slide:</label>
+  <input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
+  <datalist id="goto-datalist"></datalist>
+  <input type="submit" value="Go">
+</form>
+
+</div>
+</body>
+</html>
diff --git a/Tom-Marble/Fixing-trust-on-the-Internet.org b/Tom-Marble/Fixing-trust-on-the-Internet.org
new file mode 100644 (file)
index 0000000..441d4b0
--- /dev/null
@@ -0,0 +1,489 @@
+#+OPTIONS: num:nil toc:nil
+#+title: Fixing trust on the Internet
+
+* Meta
+** This presentation is /already/ online!
+*** [[https://info9.net/trust]]
+**** Navigation
+***** *→* = forward (swipe right)
+***** *←* = back (swipe left)
+***** *g* = goto slide
+***** *m* = menu of all slides (tap)
+***** *o* = one page
+***** *s* = scrollbars
+**** Source ([[https://github.com/cybercode/org-slides][org-mode]]): [[file:Fixing-trust-on-the-Internet.tar.xz]]
+**** Copyright © 2017 Tom Marble
+Licensed under { [[https://www.gnu.org/licenses/gpl-3.0.html][GPLv3+]] | [[http://creativecommons.org/licenses/by-sa/4.0/][CC-by-sa 4.0]] | [[https://github.com/copyleft-next/copyleft-next][copyleft-next]] }
+#+BEGIN: columnview :hlines 1 :id global
+#+ATTR_HTML: :border none :class quiettable
+| [[./images/gplv3-127x51.png]] | [[./images/CC-by-sa.png]] | [[./images/copyleft-next.png]] |
+#+END:
+
+* Software Freedom & Trust
+Software Freedom is essential to trust the core infrastructure
+that supports our health, safety, and democracy.
+
+** "We need to have confidence in our software, be able to audit it and be able to repair it when we detect vulnerabilities or unwanted functionality like surveillance."
+-- Karen Sandler [fn:1]
+
+*  Evolution of using software
+** When we gave each computer a name
+$ tar zxf code.tar.gz && ./configure && make install
+** When we configured computers automatically
+PXE boot, puppet, apt-get install my-favorite-package
+** When we moved to the cloud
+Use this prebuilt image
+** When we started using containers
+Make slight modifications to a prebuilt image
+** Now we are considering lambda functions
+There isn't an OS image anymore: just a function
+** Most software is installed from the app store
+Just accept the EULA and device permissions
+
+*  Copyleft isn't enough
+** Network services software is not conveyed
+Our FLOSS licenses (including copyleft licenses) depend on conveyance.
+*** AGPL
+AGPL "fixes" this network loophole, but hasn't been adopted
+for wide use in practice other than proprietary relicensing.
+** What about AI "algorithms"?
+What is the preferred form of modification when software is derived from data (e.g. machine learning)?
+** No one picks a license anyway
+We haven't taught developers to care [fn:2]
+** Most software is installed from the app store
+We haven't taught end users to care
+
+*  The fifth freedom
+
+Freedom 4: The right to deploy your software on someone else's server
+
+** "Even if you had the source code today you don't know how to increase other people's freedoms by letting them modify your website at runtime. All you have is a bag of tricks that let's people modify your source code and gives them no way to deploy it on your infrastructure."
+-- r0ml's LCA keynote [fn:3]
+
+*  Essential infrastructure requirements
+** Energy
+**** We need energy for computing, yet energy is centralized.
+**** Smart meters have an API for the utility, not for end users
+** Communications
+**** Why isn't there a free phone? It's the proprietary baseband processor.
+**** Potential in unlicensed spectrum, Software Defined Radio, Cognitive Radio
+** Money
+**** Digital forms of money (often) have surveillance opportunities
+**** Anonymous transactions (e.g. cash) are increasingly difficult
+#+BEGIN_HTML
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+<br/>
+#+END_HTML
+*   Peer to peer energy [fn:4]
+#+ATTR_HTML: :alt p2p :align center
+[[./images/nyt-p2p.jpg]]
+
+* Mobile apps
+#+ATTR_HTML: :class pad-right :align left
+[[./images/Dont-trust-your-apps.jpg]] [fn:5]
+
+* Where is trust now?
+#+ATTR_HTML: :class pad-right :align left
+[[./images/centralized.jpg]] [fn:6]
+
+**** Credit Bureaus
+**** eBay (reputation)
+**** other walled gardens
+
+...
+
+Closed and centralized
+
+* Shape of the solution (part 1/2)
+Network service trust API
+
+** ☙ Federated corroboration of assertions
+Harder to corrupt
+** ☙ Make and query assertions at the app level
+libtrust.so, libtrust.js
+** ☙ Transitive with personal vantage point
+**** Deb asserts the software is Free and reproducible
+**** Chris trusts Deb to certify software
+**** I trust Chris' software certification assessments
+**** ⇒ I am comfortable installing this software
+** ☙ Quick transactions
+
+* You think you know what I'm going to say now...
+
+* 13
+#+ATTR_HTML: :class fullscreen
+[[./images/tm13.png]]
+* 12
+#+ATTR_HTML: :class fullscreen
+[[./images/tm12.png]]
+* 11
+#+ATTR_HTML: :class fullscreen
+[[./images/tm11.png]]
+* 10
+#+ATTR_HTML: :class fullscreen
+[[./images/tm10.png]]
+* 9
+#+ATTR_HTML: :class fullscreen
+[[./images/tm09.png]]
+* 8
+#+ATTR_HTML: :class fullscreen
+[[./images/tm08.png]]
+* 7
+#+ATTR_HTML: :class fullscreen
+[[./images/tm07.png]]
+* 6
+#+ATTR_HTML: :class fullscreen
+[[./images/tm06.png]]
+* 5
+#+ATTR_HTML: :class fullscreen
+[[./images/tm05.png]]
+* 4
+#+ATTR_HTML: :class fullscreen
+[[./images/tm04.png]]
+* 3
+#+ATTR_HTML: :class fullscreen
+[[./images/tm03.png]]
+* 2
+#+ATTR_HTML: :class fullscreen
+[[./images/tm02.png]]
+* 1
+#+ATTR_HTML: :class fullscreen
+[[./images/tm01.png]]
+*   GPG WoT
+nah :(
+
+** The GPG Web of Trust asserts identity
+**** The trustdb is private
+**** Keyservers are not designed for other data
+** Using PGP is tricky for us
+**** Choosing algos and signature strengths
+**** Protecting key material
+**** Not getting fooled by EVIL-32 [fn:7]
+** Impossibly difficult for end users
+**** Sharing public keys
+**** Configuring applications properly
+
+* You think you know what I'm going to say NOW...
+
+*  Bitcoin
+#+ATTR_HTML: :class pad-bottom :height 300px
+[[./images/bitcoin.svg]]
+
+In Satoshi Nakamoto we trust! [fn:8]
+
+*  Hyperledger
+#+ATTR_HTML: :class pad-bottom
+[[./images/logo_hl_new.png]]
+
+It's hosted by the Linux Foundation. That means it's community friendly... rite? [fn:9]
+
+*  Ethereum
+#+ATTR_HTML: :class pad-bottom
+[[./images/ethereum.png]]
+
+Companies use it for smart contracts! [fn:10]
+
+*  Zcash
+#+ATTR_HTML: :class pad-bottom
+[[./images/zcash-logo-gold.png]]
+
+Zooko and Matthew Green [fn:11]
+
+*  DogeCoin
+#+ATTR_HTML: :class pad-bottom
+[[./images/dogecoin.png]]
+
+That's the MEME! [fn:12]
+
+* nah :(
+Wait, why NOT blockchain tech?
+** centralized -- in effect
+Domination by huge mining pools
+** bandwidth limited
+Time to process transactions long and variable
+** transaction fees
+Start to look like PayPal fees
+** a waste of energy
+Brute forcing hashes is bad [fn:13] for the environment [fn:14]
+
+*  Great barrier reef
+#+BEGIN: columnview :hlines 1 :id global
+#+ATTR_HTML: :border none :class quiettable
+| not fake news | [[./images/reef-death.jpg]] | [fn:15] |
+#+END:
+
+* What we need is..
+What's the essential thing the blockchain solves
+
+** non-repudiation
+
+* Learn by example
+#+ATTR_HTML: :class pad-right :align left
+[[./images/mall_logo1_medium-300x286.png]]
+
+**** The tire fire that is X.509 [fn:16]
+**** MiTM on the internet [fn:17]
+***** 4.0% of Firefox update connections
+***** 6.2% of e-commerce connections
+***** 10.9% of U.S. Cloudflare connections
+
+* Certificate Transparency
+
+** Use append-only logs to record certificate signatures [fn:18]
+**** Early detection of misissued certificates, malicious certificates, and rogue CAs.
+**** Faster mitigation after suspect certificates or CAs are detected.
+**** Better oversight of the entire TLS/SSL system.
+** Browser support
+**** Chrome [fn:19]
+**** Firefox [fn:20]
+** Ongoing concerns and discussion [fn:21]
+**** RFC 6962 [fn:22]
+
+* Append-only logs
+** Merkle Trees [fn:23]
+Tree of hashes, provides log(n) performance
+** eXtended Merkle Signature Scheme (XMSS) [fn:24]
+Requires maintaining state (not portable)
+** SPHINCS [fn:25]
+Stateless [fn:26]
+
+* Generic use of append-only logs
+** Trillian [fn:27]
+Merkle tree based
+** Cothority [fn:28]
+Multi-party cryptographic signatures to avoid backdoors
+** Codehash [fn:29]
+A simple oracle that answers a simple question: is this software safe to install and run? [fn:30]
+
+* Challenges
+** Toxic Data
+**** Allow deletion? Possible vulnerabilities in allowing log altering
+**** Prohibit deletion? Permanent toxicity: no way to be forgotten
+** Spam
+**** Open log with arbitrary input data?
+**** vs. CT only allowing root authorities?
+** Astroturfing
+**** Can the network be overwhelmed?
+**** vs. Is the personal vantage point immune?
+** Writing crypto safe code is difficult
+
+* Best Practices
+** Free Software with Complete and Corresponding Source
+** Code review
+**** Avoid the OpenSSL problem
+** Reproducible builds
+** Automated, Continuous integration
+**** static analysis (ASAN)
+**** coverage
+**** fuzzing
+**** tests against threats
+** As a developer you do NOT want to be a target
+**** want to do be right by your users
+**** the checks & balances keep developers from being vulnerable
+
+* Shape of the solution (part 2/2)
+
+** Research similar work
+**** append-only log alternatives
+**** Application Transparency
+**** Binary Transparency [fn:31]
+** Address the Challenges
+** Use Best Practices
+** Under the umbrella of a fiscal sponsorship organization
+**** Governance review
+
+* Software Freedom Conservancy
+Why you should support Conservancy:
+
+** 🌲 supports diversity and is home to Outreachy [fn:32]
+** 🌲 helps hackers: ContractPatch [fn:33]
+** 🌲 is a 501(c)3 charity supported by individuals [fn:34]
+*** Please join today!
+https://sfconservancy.org/
+
+*disclaimer: I'm on the Conservancy Evaluation Committee*
+
+* Possible first use case: Debian
+Protect against compromised repositories
+
+** On package publication (by the Debian project)
+**** put package signature into an append-only log
+** On package installation (by the user, via apt-get plugin)
+**** verify package signatures with the log
+**** publish suspicious checksum to an auditor
+**** option to not install mismatched packages
+
+* Why talk trust at LibrePlanet?
+** Because of the people in this room!
+**** We understand the tech
+**** We understand why trust matters to end users
+**** We are the peer reviewers
+** Need to reach more than just developers...
+**** User experience experts
+**** Lawyers: How to reprise the "hack on copyright" to protect network services
+**** Activists: Help end users understand and care!
+
+* Q/A & Where we go from here
+** Call to action: Join the [trust-api] mailing list
+http://lists.info9.net/mailman/listinfo/trust-api
+** Cuddles asks a question??? [fn:35]
+#+ATTR_HTML: :alt Cuddles :align center
+[[./images/cuddles-qa.jpg]]
+
+* References
+Footnote references (press 's' for scrollbars)
+#+BEGIN_HTML
+<input type="button" value="◁" onclick="window.history.back()"/>
+<ol>
+
+<li id="fn:1"> <a href="https://sfconservancy.org/blog/2016/dec/29/software-freedom-after-trump/">https://sfconservancy.org/blog/2016/dec/29/software-freedom-after-trump/</a>
+
+<li id="fn:2"> See 48:35 in r0ml's talk on how the minority of GitHub projects actually have a license:
+<a href="https://www.youtube.com/watch?v=i3nJR7PNgI4&feature=youtu.be&t=2915">https://www.youtube.com/watch?v=i3nJR7PNgI4&feature=youtu.be&t=2915</a>
+
+<li id="fn:3"> <a href="https://www.youtube.com/watch?v=i3nJR7PNgI4">https://www.youtube.com/watch?v=i3nJR7PNgI4</a>
+
+<li id="fn:4"> <a href="https://www.nytimes.com/2017/03/13/business/energy-environment/brooklyn-solar-grid-energy-trading.html">https://www.nytimes.com/2017/03/13/business/energy-environment/brooklyn-solar-grid-energy-trading.html</a>
+
+<li id="fn:5"> <a href="http://www.usatoday.com/story/tech/news/2017/03/06/mapping-software-routing-waze-google-traffic-calming-algorithmsi/98588980/">http://www.usatoday.com/story/tech/news/2017/03/06/mapping-software-routing-waze-google-traffic-calming-algorithmsi/98588980/</a>
+
+<li id="fn:6"> <a href="https://archive.fosdem.org/2014/schedule/event/network_freedom/">https://archive.fosdem.org/2014/schedule/event/network_freedom/</a>
+
+<li id="fn:7"> <a href="https://evil32.com/">https://evil32.com/</a>
+
+<li id="fn:8"> <a href="https://bitcoin.org/en/">https://bitcoin.org/en/</a>
+
+<li id="fn:9"> <a href="https://www.hyperledger.org/">https://www.hyperledger.org/</a>
+
+<li id="fn:10"> <a href="https://www.ethereum.org/">https://www.ethereum.org/</a>
+
+<li id="fn:11"> <a href="https://z.cash/">https://z.cash/</a>
+
+<li id="fn:12"> <a href="http://dogecoin.com/">http://dogecoin.com/</a>
+
+<li id="fn:13"> <a href="http://www.abc.net.au/news/2015-10-06/quiggin-bitcoins-are-a-waste-of-energy/6827940">http://www.abc.net.au/news/2015-10-06/quiggin-bitcoins-are-a-waste-of-energy/6827940</a>
+
+<li id="fn:14"> <a href="https://www.bitcoinmining.com/is-bitcoin-mining-waste-electricity/">https://www.bitcoinmining.com/is-bitcoin-mining-waste-electricity/</a>
+
+<li id="fn:15"> <a href="http://www.news.com.au/technology/environment/natural-wonders/before-and-after-great-barrier-reef-photos-expose-shocking-realities-of-coral-bleaching/news-story/527d7599f160532474b27f1ca26fdbfc">http://www.news.com.au/technology/environment/natural-wonders/before-and-after-great-barrier-reef-photos-expose-shocking-realities-of-coral-bleaching/news-story/527d7599f160532474b27f1ca26fdbfc</a>
+
+<li id="fn:16"> Security Now, Epsiode #599
+<a href="https://www.grc.com/securitynow.htm">https://www.grc.com/securitynow.htm</a>
+
+<li id="fn:17"> <a href="https://jhalderm.com/pub/papers/interception-ndss17.pdf">https://jhalderm.com/pub/papers/interception-ndss17.pdf</a>
+
+<li id="fn:18"> <a href="https://www.certificate-transparency.org/">https://www.certificate-transparency.org/</a>
+
+<li id="fn:19"> <a href="https://www.thesslstore.com/blog/google-chrome-certificate-transparency-2017/">https://www.thesslstore.com/blog/google-chrome-certificate-transparency-2017/</a>
+
+<li id="fn:20"> <a href="https://www.thesslstore.com/blog/firefox-certificate-transparency/">https://www.thesslstore.com/blog/firefox-certificate-transparency/</a>
+
+<li id="fn:21"> <a href="https://www.ietf.org/mailman/listinfo/trans">https://www.ietf.org/mailman/listinfo/trans</a>
+
+<li id="fn:22"> <a href="https://datatracker.ietf.org/doc/rfc6962/">https://datatracker.ietf.org/doc/rfc6962/</a>
+
+<li id="fn:23"> <a href="https://en.wikipedia.org/wiki/Merkle_tree">https://en.wikipedia.org/wiki/Merkle_tree</a>
+
+<li id="fn:24"> <a href="https://eprint.iacr.org/2011/484.pdf">https://eprint.iacr.org/2011/484.pdf</a>
+
+<li id="fn:25"> <a href="https://sphincs.cr.yp.to/">https://sphincs.cr.yp.to/</a>
+
+<li id="fn:26"> <a href="https://cryptoservices.github.io/quantum/2015/12/08/XMSS-and-SPHINCS.html">https://cryptoservices.github.io/quantum/2015/12/08/XMSS-and-SPHINCS.html</a>
+
+<li id="fn:27"> <a href="https://github.com/google/trillian">https://github.com/google/trillian</a>
+
+<li id="fn:28"> <a href="https://boingboing.net/2016/03/10/using-distributed-code-signatu.html">https://boingboing.net/2016/03/10/using-distributed-code-signatu.html</a>
+
+<li id="fn:29"> <a href="https://github.com/rootkovska/codehash.db">https://github.com/rootkovska/codehash.db</a>
+
+<li id="fn:30"> <a href="https://secure-os.org/pipermail/desktops/2016-November/000143.html">https://secure-os.org/pipermail/desktops/2016-November/000143.html</a>
+
+<li id="fn:31"> <a href="https://github.com/FreeBSDFoundation/binary-transparency-notes">https://github.com/FreeBSDFoundation/binary-transparency-notes</a>
+
+<li id="fn:32"> <a href="https://www.gnome.org/outreachy/">https://www.gnome.org/outreachy/</a>
+
+<li id="fn:33"> <a href="https://sfconservancy.org/blog/?tag=ContractPatch">https://sfconservancy.org/blog/?tag=ContractPatch</a>
+
+<li id="fn:34"> <a href="https://sfconservancy.org/supporter/">https://sfconservancy.org/supporter/</a>
+
+<li id="fn:35"> cuddles: Copyright © 2017 Tom Marble, CC-by-sa 4.0</ol>
+#+END_HTML
+* Footnotes
+
+[fn:1] https://sfconservancy.org/blog/2016/dec/29/software-freedom-after-trump/
+
+[fn:2] See 48:35 in r0ml's talk on how the minority of GitHub projects actually have a license:
+https://www.youtube.com/watch?v=i3nJR7PNgI4&feature=youtu.be&t=2915
+
+[fn:3] https://www.youtube.com/watch?v=i3nJR7PNgI4
+
+[fn:4] https://www.nytimes.com/2017/03/13/business/energy-environment/brooklyn-solar-grid-energy-trading.html
+
+[fn:5] http://www.usatoday.com/story/tech/news/2017/03/06/mapping-software-routing-waze-google-traffic-calming-algorithmsi/98588980/
+
+[fn:6] https://archive.fosdem.org/2014/schedule/event/network_freedom/
+
+[fn:7] https://evil32.com/
+
+[fn:8] https://bitcoin.org/en/
+
+[fn:9] https://www.hyperledger.org/
+
+[fn:10] https://www.ethereum.org/
+
+[fn:11] https://z.cash/
+
+[fn:12] http://dogecoin.com/
+
+[fn:13] http://www.abc.net.au/news/2015-10-06/quiggin-bitcoins-are-a-waste-of-energy/6827940
+
+[fn:14] https://www.bitcoinmining.com/is-bitcoin-mining-waste-electricity/
+
+[fn:15] http://www.news.com.au/technology/environment/natural-wonders/before-and-after-great-barrier-reef-photos-expose-shocking-realities-of-coral-bleaching/news-story/527d7599f160532474b27f1ca26fdbfc
+
+[fn:16] Security Now, Epsiode #599
+https://www.grc.com/securitynow.htm
+
+[fn:17] https://jhalderm.com/pub/papers/interception-ndss17.pdf
+
+[fn:18] https://www.certificate-transparency.org/
+
+[fn:19] https://www.thesslstore.com/blog/google-chrome-certificate-transparency-2017/
+
+[fn:20] https://www.thesslstore.com/blog/firefox-certificate-transparency/
+
+[fn:21] https://www.ietf.org/mailman/listinfo/trans
+
+[fn:22] https://datatracker.ietf.org/doc/rfc6962/
+
+[fn:23] https://en.wikipedia.org/wiki/Merkle_tree
+
+[fn:24] https://eprint.iacr.org/2011/484.pdf
+
+[fn:25] https://sphincs.cr.yp.to/
+
+[fn:26] https://cryptoservices.github.io/quantum/2015/12/08/XMSS-and-SPHINCS.html
+
+[fn:27] https://github.com/google/trillian
+
+[fn:28] https://boingboing.net/2016/03/10/using-distributed-code-signatu.html
+
+[fn:29] https://github.com/rootkovska/codehash.db
+
+[fn:30] https://secure-os.org/pipermail/desktops/2016-November/000143.html
+
+[fn:31] https://github.com/FreeBSDFoundation/binary-transparency-notes
+
+[fn:32] https://www.gnome.org/outreachy/
+
+[fn:33] https://sfconservancy.org/blog/?tag=ContractPatch
+
+[fn:34] https://sfconservancy.org/supporter/
+
+[fn:35] cuddles: Copyright © 2017 Tom Marble, CC-by-sa 4.0
diff --git a/Tom-Marble/Fixing-trust-on-the-Internet.tar.xz b/Tom-Marble/Fixing-trust-on-the-Internet.tar.xz
new file mode 100644 (file)
index 0000000..deb7248
Binary files /dev/null and b/Tom-Marble/Fixing-trust-on-the-Internet.tar.xz differ
diff --git a/Tom-Marble/LICENSES/CC-by-sa-4.txt b/Tom-Marble/LICENSES/CC-by-sa-4.txt
new file mode 100644 (file)
index 0000000..e26cd4f
--- /dev/null
@@ -0,0 +1,425 @@
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+     Considerations for licensors: Our public licenses are
+     intended for use by those authorized to give the public
+     permission to use material in ways otherwise restricted by
+     copyright and certain other rights. Our licenses are
+     irrevocable. Licensors should read and understand the terms
+     and conditions of the license they choose before applying it.
+     Licensors should also secure all rights necessary before
+     applying our licenses so that the public can reuse the
+     material as expected. Licensors should clearly mark any
+     material not subject to the license. This includes other CC-
+     licensed material, or material used under an exception or
+     limitation to copyright. More considerations for licensors:
+       wiki.creativecommons.org/Considerations_for_licensors
+
+     Considerations for the public: By using one of our public
+     licenses, a licensor grants the public permission to use the
+     licensed material under specified terms and conditions. If
+     the licensor's permission is not necessary for any reason--for
+     example, because of any applicable exception or limitation to
+     copyright--then that use is not regulated by the license. Our
+     licenses grant only permissions under copyright and certain
+     other rights that a licensor has authority to grant. Use of
+     the licensed material may still be restricted for other
+     reasons, including because others have copyright or other
+     rights in the material. A licensor may make special requests,
+     such as asking that all changes be marked or described.
+     Although not required by our licenses, you are encouraged to
+     respect those requests where reasonable. More_considerations
+     for the public:
+       wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+  a. Adapted Material means material subject to Copyright and Similar
+     Rights that is derived from or based upon the Licensed Material
+     and in which the Licensed Material is translated, altered,
+     arranged, transformed, or otherwise modified in a manner requiring
+     permission under the Copyright and Similar Rights held by the
+     Licensor. For purposes of this Public License, where the Licensed
+     Material is a musical work, performance, or sound recording,
+     Adapted Material is always produced where the Licensed Material is
+     synched in timed relation with a moving image.
+
+  b. Adapter's License means the license You apply to Your Copyright
+     and Similar Rights in Your contributions to Adapted Material in
+     accordance with the terms and conditions of this Public License.
+
+  c. BY-SA Compatible License means a license listed at
+     creativecommons.org/compatiblelicenses, approved by Creative
+     Commons as essentially the equivalent of this Public License.
+
+  d. Copyright and Similar Rights means copyright and/or similar rights
+     closely related to copyright including, without limitation,
+     performance, broadcast, sound recording, and Sui Generis Database
+     Rights, without regard to how the rights are labeled or
+     categorized. For purposes of this Public License, the rights
+     specified in Section 2(b)(1)-(2) are not Copyright and Similar
+     Rights.
+
+  e. Effective Technological Measures means those measures that, in the
+     absence of proper authority, may not be circumvented under laws
+     fulfilling obligations under Article 11 of the WIPO Copyright
+     Treaty adopted on December 20, 1996, and/or similar international
+     agreements.
+
+  f. Exceptions and Limitations means fair use, fair dealing, and/or
+     any other exception or limitation to Copyright and Similar Rights
+     that applies to Your use of the Licensed Material.
+
+  g. License Elements means the license attributes listed in the name
+     of a Creative Commons Public License. The License Elements of this
+     Public License are Attribution and ShareAlike.
+
+  h. Licensed Material means the artistic or literary work, database,
+     or other material to which the Licensor applied this Public
+     License.
+
+  i. Licensed Rights means the rights granted to You subject to the
+     terms and conditions of this Public License, which are limited to
+     all Copyright and Similar Rights that apply to Your use of the
+     Licensed Material and that the Licensor has authority to license.
+
+  j. Licensor means the individual(s) or entity(ies) granting rights
+     under this Public License.
+
+  k. Share means to provide material to the public by any means or
+     process that requires permission under the Licensed Rights, such
+     as reproduction, public display, public performance, distribution,
+     dissemination, communication, or importation, and to make material
+     available to the public including in ways that members of the
+     public may access the material from a place and at a time
+     individually chosen by them.
+
+  l. Sui Generis Database Rights means rights other than copyright
+     resulting from Directive 96/9/EC of the European Parliament and of
+     the Council of 11 March 1996 on the legal protection of databases,
+     as amended and/or succeeded, as well as other essentially
+     equivalent rights anywhere in the world.
+
+  m. You means the individual or entity exercising the Licensed Rights
+     under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+  a. License grant.
+
+       1. Subject to the terms and conditions of this Public License,
+          the Licensor hereby grants You a worldwide, royalty-free,
+          non-sublicensable, non-exclusive, irrevocable license to
+          exercise the Licensed Rights in the Licensed Material to:
+
+            a. reproduce and Share the Licensed Material, in whole or
+               in part; and
+
+            b. produce, reproduce, and Share Adapted Material.
+
+       2. Exceptions and Limitations. For the avoidance of doubt, where
+          Exceptions and Limitations apply to Your use, this Public
+          License does not apply, and You do not need to comply with
+          its terms and conditions.
+
+       3. Term. The term of this Public License is specified in Section
+          6(a).
+
+       4. Media and formats; technical modifications allowed. The
+          Licensor authorizes You to exercise the Licensed Rights in
+          all media and formats whether now known or hereafter created,
+          and to make technical modifications necessary to do so. The
+          Licensor waives and/or agrees not to assert any right or
+          authority to forbid You from making technical modifications
+          necessary to exercise the Licensed Rights, including
+          technical modifications necessary to circumvent Effective
+          Technological Measures. For purposes of this Public License,
+          simply making modifications authorized by this Section 2(a)
+          (4) never produces Adapted Material.
+
+       5. Downstream recipients.
+
+            a. Offer from the Licensor -- Licensed Material. Every
+               recipient of the Licensed Material automatically
+               receives an offer from the Licensor to exercise the
+               Licensed Rights under the terms and conditions of this
+               Public License.
+
+            b. Additional offer from the Licensor -- Adapted Material.
+               Every recipient of Adapted Material from You
+               automatically receives an offer from the Licensor to
+               exercise the Licensed Rights in the Adapted Material
+               under the conditions of the Adapter's License You apply.
+
+            c. No downstream restrictions. You may not offer or impose
+               any additional or different terms or conditions on, or
+               apply any Effective Technological Measures to, the
+               Licensed Material if doing so restricts exercise of the
+               Licensed Rights by any recipient of the Licensed
+               Material.
+
+       6. No endorsement. Nothing in this Public License constitutes or
+          may be construed as permission to assert or imply that You
+          are, or that Your use of the Licensed Material is, connected
+          with, or sponsored, endorsed, or granted official status by,
+          the Licensor or others designated to receive attribution as
+          provided in Section 3(a)(1)(A)(i).
+
+  b. Other rights.
+
+       1. Moral rights, such as the right of integrity, are not
+          licensed under this Public License, nor are publicity,
+          privacy, and/or other similar personality rights; however, to
+          the extent possible, the Licensor waives and/or agrees not to
+          assert any such rights held by the Licensor to the limited
+          extent necessary to allow You to exercise the Licensed
+          Rights, but not otherwise.
+
+       2. Patent and trademark rights are not licensed under this
+          Public License.
+
+       3. To the extent possible, the Licensor waives any right to
+          collect royalties from You for the exercise of the Licensed
+          Rights, whether directly or through a collecting society
+          under any voluntary or waivable statutory or compulsory
+          licensing scheme. In all other cases the Licensor expressly
+          reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+  a. Attribution.
+
+       1. If You Share the Licensed Material (including in modified
+          form), You must:
+
+            a. retain the following if it is supplied by the Licensor
+               with the Licensed Material:
+
+                 i. identification of the creator(s) of the Licensed
+                    Material and any others designated to receive
+                    attribution, in any reasonable manner requested by
+                    the Licensor (including by pseudonym if
+                    designated);
+
+                ii. a copyright notice;
+
+               iii. a notice that refers to this Public License;
+
+                iv. a notice that refers to the disclaimer of
+                    warranties;
+
+                 v. a URI or hyperlink to the Licensed Material to the
+                    extent reasonably practicable;
+
+            b. indicate if You modified the Licensed Material and
+               retain an indication of any previous modifications; and
+
+            c. indicate the Licensed Material is licensed under this
+               Public License, and include the text of, or the URI or
+               hyperlink to, this Public License.
+
+       2. You may satisfy the conditions in Section 3(a)(1) in any
+          reasonable manner based on the medium, means, and context in
+          which You Share the Licensed Material. For example, it may be
+          reasonable to satisfy the conditions by providing a URI or
+          hyperlink to a resource that includes the required
+          information.
+
+       3. If requested by the Licensor, You must remove any of the
+          information required by Section 3(a)(1)(A) to the extent
+          reasonably practicable.
+
+  b. ShareAlike.
+
+     In addition to the conditions in Section 3(a), if You Share
+     Adapted Material You produce, the following conditions also apply.
+
+       1. The Adapter's License You apply must be a Creative Commons
+          license with the same License Elements, this version or
+          later, or a BY-SA Compatible License.
+
+       2. You must include the text of, or the URI or hyperlink to, the
+          Adapter's License You apply. You may satisfy this condition
+          in any reasonable manner based on the medium, means, and
+          context in which You Share Adapted Material.
+
+       3. You may not offer or impose any additional or different terms
+          or conditions on, or apply any Effective Technological
+          Measures to, Adapted Material that restrict exercise of the
+          rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+     to extract, reuse, reproduce, and Share all or a substantial
+     portion of the contents of the database;
+
+  b. if You include all or a substantial portion of the database
+     contents in a database in which You have Sui Generis Database
+     Rights, then the database in which You have Sui Generis Database
+     Rights (but not its individual contents) is Adapted Material,
+
+     including for purposes of Section 3(b); and
+  c. You must comply with the conditions in Section 3(a) if You Share
+     all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+  c. The disclaimer of warranties and limitation of liability provided
+     above shall be interpreted in a manner that, to the extent
+     possible, most closely approximates an absolute disclaimer and
+     waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+  a. This Public License applies for the term of the Copyright and
+     Similar Rights licensed here. However, if You fail to comply with
+     this Public License, then Your rights under this Public License
+     terminate automatically.
+
+  b. Where Your right to use the Licensed Material has terminated under
+     Section 6(a), it reinstates:
+
+       1. automatically as of the date the violation is cured, provided
+          it is cured within 30 days of Your discovery of the
+          violation; or
+
+       2. upon express reinstatement by the Licensor.
+
+     For the avoidance of doubt, this Section 6(b) does not affect any
+     right the Licensor may have to seek remedies for Your violations
+     of this Public License.
+
+  c. For the avoidance of doubt, the Licensor may also offer the
+     Licensed Material under separate terms or conditions or stop
+     distributing the Licensed Material at any time; however, doing so
+     will not terminate this Public License.
+
+  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+     License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+  a. The Licensor shall not be bound by any additional or different
+     terms or conditions communicated by You unless expressly agreed.
+
+  b. Any arrangements, understandings, or agreements regarding the
+     Licensed Material not stated herein are separate from and
+     independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+  a. For the avoidance of doubt, this Public License does not, and
+     shall not be interpreted to, reduce, limit, restrict, or impose
+     conditions on any use of the Licensed Material that could lawfully
+     be made without permission under this Public License.
+
+  b. To the extent possible, if any provision of this Public License is
+     deemed unenforceable, it shall be automatically reformed to the
+     minimum extent necessary to make it enforceable. If the provision
+     cannot be reformed, it shall be severed from this Public License
+     without affecting the enforceability of the remaining terms and
+     conditions.
+
+  c. No term or condition of this Public License will be waived and no
+     failure to comply consented to unless expressly agreed to by the
+     Licensor.
+
+  d. Nothing in this Public License constitutes or may be interpreted
+     as a limitation upon, or waiver of, any privileges and immunities
+     that apply to the Licensor or You, including from the legal
+     processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public licenses.
+Notwithstanding, Creative Commons may elect to apply one of its public
+licenses to material it publishes and in those instances will be
+considered the "Licensor." Except for the limited purpose of indicating
+that material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the public
+licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/Tom-Marble/LICENSES/GPL-3.txt b/Tom-Marble/LICENSES/GPL-3.txt
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Tom-Marble/LICENSES/copyleft-next-0.3.1 b/Tom-Marble/LICENSES/copyleft-next-0.3.1
new file mode 100644 (file)
index 0000000..36d8515
--- /dev/null
@@ -0,0 +1,220 @@
+                      copyleft-next 0.3.1 ("this License")
+                            Release date: 2016-04-29
+
+1. License Grants; No Trademark License
+
+   Subject to the terms of this License, I grant You:
+
+   a) A non-exclusive, worldwide, perpetual, royalty-free, irrevocable
+      copyright license, to reproduce, Distribute, prepare derivative works
+      of, publicly perform and publicly display My Work.
+
+   b) A non-exclusive, worldwide, perpetual, royalty-free, irrevocable
+      patent license under Licensed Patents to make, have made, use, sell,
+      offer for sale, and import Covered Works.
+
+   This License does not grant any rights in My name, trademarks, service
+   marks, or logos.
+
+2. Distribution: General Conditions
+
+   You may Distribute Covered Works, provided that You (i) inform
+   recipients how they can obtain a copy of this License; (ii) satisfy the
+   applicable conditions of sections 3 through 6; and (iii) preserve all
+   Legal Notices contained in My Work (to the extent they remain
+   pertinent). "Legal Notices" means copyright notices, license notices,
+   license texts, and author attributions, but does not include logos,
+   other graphical images, trademarks or trademark legends.
+
+3. Conditions for Distributing Derived Works; Outbound GPL Compatibility
+
+   If You Distribute a Derived Work, You must license the entire Derived
+   Work as a whole under this License, with prominent notice of such
+   licensing. This condition may not be avoided through such means as
+   separate Distribution of portions of the Derived Work.
+
+   If the Derived Work includes material licensed under the GPL, You may
+   instead license the Derived Work under the GPL.
+   
+4. Condition Against Further Restrictions; Inbound License Compatibility
+
+   When Distributing a Covered Work, You may not impose further
+   restrictions on the exercise of rights in the Covered Work granted under
+   this License. This condition is not excused merely because such
+   restrictions result from Your compliance with conditions or obligations
+   extrinsic to this License (such as a court order or an agreement with a
+   third party).
+
+   However, You may Distribute a Covered Work incorporating material
+   governed by a license that is both OSI-Approved and FSF-Free as of the
+   release date of this License, provided that compliance with such
+   other license would not conflict with any conditions stated in other
+   sections of this License.
+
+5. Conditions for Distributing Object Code
+
+   You may Distribute an Object Code form of a Covered Work, provided that
+   you accompany the Object Code with a URL through which the Corresponding
+   Source is made available, at no charge, by some standard or customary
+   means of providing network access to source code.
+
+   If you Distribute the Object Code in a physical product or tangible
+   storage medium ("Product"), the Corresponding Source must be available
+   through such URL for two years from the date of Your most recent
+   Distribution of the Object Code in the Product. However, if the Product
+   itself contains or is accompanied by the Corresponding Source (made
+   available in a customarily accessible manner), You need not also comply
+   with the first paragraph of this section.
+
+   Each direct and indirect recipient of the Covered Work from You is an
+   intended third-party beneficiary of this License solely as to this
+   section 5, with the right to enforce its terms.
+
+6. Symmetrical Licensing Condition for Upstream Contributions
+
+   If You Distribute a work to Me specifically for inclusion in or
+   modification of a Covered Work (a "Patch"), and no explicit licensing
+   terms apply to the Patch, You license the Patch under this License, to
+   the extent of Your copyright in the Patch. This condition does not
+   negate the other conditions of this License, if applicable to the Patch.
+
+7. Nullification of Copyleft/Proprietary Dual Licensing
+
+   If I offer to license, for a fee, a Covered Work under terms other than
+   a license that is OSI-Approved or FSF-Free as of the release date of this
+   License or a numbered version of copyleft-next released by the
+   Copyleft-Next Project, then the license I grant You under section 1 is no
+   longer subject to the conditions in sections 3 through 5.
+
+8. Copyleft Sunset
+
+   The conditions in sections 3 through 5 no longer apply once fifteen
+   years have elapsed from the date of My first Distribution of My Work
+   under this License.
+
+9. Pass-Through
+
+   When You Distribute a Covered Work, the recipient automatically receives
+   a license to My Work from Me, subject to the terms of this License.
+
+10. Termination
+
+    Your license grants under section 1 are automatically terminated if You
+
+    a) fail to comply with the conditions of this License, unless You cure
+       such noncompliance within thirty days after becoming aware of it, or
+
+    b) initiate a patent infringement litigation claim (excluding
+       declaratory judgment actions, counterclaims, and cross-claims)
+       alleging that any part of My Work directly or indirectly infringes
+       any patent.
+
+    Termination of Your license grants extends to all copies of Covered
+    Works You subsequently obtain. Termination does not terminate the
+    rights of those who have received copies or rights from You subject to
+    this License.
+
+    To the extent permission to make copies of a Covered Work is necessary
+    merely for running it, such permission is not terminable.
+
+11. Later License Versions
+
+    The Copyleft-Next Project may release new versions of copyleft-next,
+    designated by a distinguishing version number ("Later Versions").
+    Unless I explicitly remove the option of Distributing Covered Works
+    under Later Versions, You may Distribute Covered Works under any Later
+    Version.
+
+** 12. No Warranty                                                       **
+**                                                                       **
+**     My Work is provided "as-is", without warranty. You bear the risk  **
+**     of using it. To the extent permitted by applicable law, each      **
+**     Distributor of My Work excludes the implied warranties of title,  **
+**     merchantability, fitness for a particular purpose and             **
+**     non-infringement.                                                 **
+
+** 13. Limitation of Liability                                           **
+**                                                                       **
+**     To the extent permitted by applicable law, in no event will any   **
+**     Distributor of My Work be liable to You for any damages           **
+**     whatsoever, whether direct, indirect, special, incidental, or     **
+**     consequential damages, whether arising under contract, tort       **
+**     (including negligence), or otherwise, even where the Distributor  **
+**     knew or should have known about the possibility of such damages.  **
+
+14. Severability
+
+    The invalidity or unenforceability of any provision of this License
+    does not affect the validity or enforceability of the remainder of
+    this License. Such provision is to be reformed to the minimum extent
+    necessary to make it valid and enforceable.
+
+15. Definitions
+
+    "Copyleft-Next Project" means the project that maintains the source
+    code repository at <https://github.com/copyleft-next/copyleft-next.git/>
+    as of the release date of this License.
+
+    "Corresponding Source" of a Covered Work in Object Code form means (i)
+    the Source Code form of the Covered Work; (ii) all scripts,
+    instructions and similar information that are reasonably necessary for
+    a skilled developer to generate such Object Code from the Source Code
+    provided under (i); and (iii) a list clearly identifying all Separate
+    Works (other than those provided in compliance with (ii)) that were
+    specifically used in building and (if applicable) installing the
+    Covered Work (for example, a specified proprietary compiler including
+    its version number). Corresponding Source must be machine-readable.
+
+    "Covered Work" means My Work or a Derived Work.
+
+    "Derived Work" means a work of authorship that copies from, modifies,
+    adapts, is based on, is a derivative work of, transforms, translates or
+    contains all or part of My Work, such that copyright permission is
+    required. The following are not Derived Works: (i) Mere Aggregation;
+    (ii) a mere reproduction of My Work; and (iii) if My Work fails to
+    explicitly state an expectation otherwise, a work that merely makes
+    reference to My Work.
+
+    "Distribute" means to distribute, transfer or make a copy available to
+    someone else, such that copyright permission is required.
+
+    "Distributor" means Me and anyone else who Distributes a Covered Work.
+
+    "FSF-Free" means classified as 'free' by the Free Software Foundation.
+
+    "GPL" means a version of the GNU General Public License or the GNU
+    Affero General Public License.
+
+    "I"/"Me"/"My" refers to the individual or legal entity that places My
+    Work under this License. "You"/"Your" refers to the individual or legal
+    entity exercising rights in My Work under this License. A legal entity
+    includes each entity that controls, is controlled by, or is under
+    common control with such legal entity. "Control" means (a) the power to
+    direct the actions of such legal entity, whether by contract or
+    otherwise, or (b) ownership of more than fifty percent of the
+    outstanding shares or beneficial ownership of such legal entity.
+
+    "Licensed Patents" means all patent claims licensable royalty-free by
+    Me, now or in the future, that are necessarily infringed by making,
+    using, or selling My Work, and excludes claims that would be infringed
+    only as a consequence of further modification of My Work.
+
+    "Mere Aggregation" means an aggregation of a Covered Work with a
+    Separate Work.
+
+    "My Work" means the particular work of authorship I license to You
+    under this License.
+
+    "Object Code" means any form of a work that is not Source Code.
+
+    "OSI-Approved" means approved as 'Open Source' by the Open Source
+    Initiative.
+
+    "Separate Work" means a work that is separate from and independent of a
+    particular Covered Work and is not by its nature an extension or
+    enhancement of the Covered Work, and/or a runtime library, standard
+    library or similar component that is used to generate an Object Code
+    form of a Covered Work.
+
+    "Source Code" means the preferred form of a work for making
+    modifications to it.
diff --git a/Tom-Marble/Makefile b/Tom-Marble/Makefile
new file mode 100644 (file)
index 0000000..f60f581
--- /dev/null
@@ -0,0 +1,17 @@
+
+TITLE = Fixing-trust-on-the-Internet
+
+all: pack
+
+pack:
+       tar Jchvf $(TITLE).tar.xz  \
+         --exclude='.git' --exclude='*~' \
+          ./LICENSES ./Makefile ./src ./images ./deck.js \
+         ./$(TITLE).org ./$(TITLE).html
+
+unpack:
+       -@echo "...Here are the commands to unpack the presentation..."
+       -@echo mkdir $(TITLE)
+       -@echo cd $(TITLE)/
+       -@echo tar Jxvf ../$(TITLE).tar.xz
+       -@echo mv ../$(TITLE).tar.xz ./
diff --git a/Tom-Marble/deck.js/CHANGELOG.md b/Tom-Marble/deck.js/CHANGELOG.md
new file mode 100644 (file)
index 0000000..6645baa
--- /dev/null
@@ -0,0 +1,10 @@
+# Changelog
+
+## v1.1.0
+
+- Expand `beforeInit` event to allow halting of init event.
+- Create alternative init signature with single options object using new `options.selectors.slides` option.
+- Added methods `getTopLevelSlides` and `getNestedSlides`.
+- Integrated hash plugin into core.
+- Allow for touch swiping to be axis specific or disabled.
+- Include ARIA attribute considerations in core and extensions.
diff --git a/Tom-Marble/deck.js/MIT-license.txt b/Tom-Marble/deck.js/MIT-license.txt
new file mode 100644 (file)
index 0000000..3eec286
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License\r
+\r
+Copyright (c) 2011-2014 Caleb Troughton\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in\r
+all copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+THE SOFTWARE.\r
diff --git a/Tom-Marble/deck.js/Makefile b/Tom-Marble/deck.js/Makefile
new file mode 100644 (file)
index 0000000..04076c2
--- /dev/null
@@ -0,0 +1,12 @@
+SASSOPTS=--scss --style expanded
+
+default: generate
+
+generate:
+       sass --update ${SASSOPTS} .
+
+force:
+       sass --update ${SASSOPTS} --force .
+
+watch:
+       sass --watch  ${SASSOPTS} .
diff --git a/Tom-Marble/deck.js/README.md b/Tom-Marble/deck.js/README.md
new file mode 100644 (file)
index 0000000..0e758d2
--- /dev/null
@@ -0,0 +1,60 @@
+#deck.js
+
+A JavaScript library for building modern HTML presentations. deck.js is flexible enough to let advanced CSS and JavaScript authors craft highly customized decks, but also provides templates and themes for the HTML novice to build a standard slideshow.
+
+## Quick Start
+
+This repository includes a `boilerplate.html` as a starting point, with all the extensions included. Just [download it](https://github.com/imakewebthings/deck.js/archive/latest.zip), open `boilerplate.html`, and start editing your slides.
+
+## Documentation
+
+Check out the [documentation page](http://imakewebthings.com/deck.js/docs) for more information on the methods, events, and options available in core and all the included extensions.  A sample standard slide deck is included in the package under the `introduction` folder.  You can also [view that sample deck](http://imakewebthings.com/deck.js/introduction) online to play with the available style and transition themes.
+
+## Extensions, Themes, and Related Projects
+
+Take a look at [the wiki](https://github.com/imakewebthings/deck.js/wiki) for lists of extensions, themes, and other related goodies.  If you have a publicly available project of your own, feel free to add to the list.
+
+## Dependencies (included in this repository)
+
+- [jQuery](http://jquery.com)
+- [Modernizr](http://modernizr.com)
+
+## Tests & Support
+
+Unit tests are written with [Jasmine](http://jasmine.github.io/) and [jasmine-jquery](https://github.com/velesin/jasmine-jquery). You can [run them here](http://imakewebthings.com/deck.js/test).
+
+deck.js has been tested with jQuery 1.6+ and works in IE7+, Chrome, FF, Safari, and Opera. The more capable browsers receive greater enhancements, but a basic cutaway slideshow will work for all browsers listed above. Please don't give your presentations in IE6.
+
+For any questions or general discussion about deck.js please direct your attention to the [mailing list](http://groups.google.com/group/deckjs) (uses Google groups.)  If you would like to report a bug, please see the [issues page](https://github.com/imakewebthings/deck.js/issues).
+
+## Printing
+
+Core includes stripped down black and white print styles for the standard slide template that is suitable for handouts.
+
+## Awesome Contributors
+
+- [jbuck](https://github.com/jbuck)
+- [cykod](https://github.com/cykod)
+- [dougireton](https://github.com/dougireton)
+- [awirick](https://github.com/awirick)
+- Daniel Knittl-Frank
+- [alexch](https://github.com/alexch)
+- [twitwi](https://github.com/twitwi)
+
+If you would like to contribute a patch to deck.js please do as much as you can of the following:
+
+- Add or amend Jasmine tests.
+- Add inline documentation.
+- If the standard snippet of an extension changes, please change it in both the introduction deck and the snippet html in the extension folder.
+- If the API changes, it would be awesome to receive a parallel pull request to the gh-pages branch which updates the public-facing documentation.
+
+## License
+
+Copyright (c) 2011-2014 Caleb Troughton
+
+Licensed under the [MIT license](https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt)
+
+## Donations
+
+[![Gittip donate
+button](http://img.shields.io/gittip/imakewebthings.png)](https://www.gittip.com/imakewebthings/ "Donate weekly to this project using Gittip")
diff --git a/Tom-Marble/deck.js/boilerplate.html b/Tom-Marble/deck.js/boilerplate.html
new file mode 100644 (file)
index 0000000..b901d24
--- /dev/null
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=1024, user-scalable=no">
+
+  <title>Your deck.js Presentation</title>
+
+  <!-- Required stylesheet -->
+  <link rel="stylesheet" media="screen" href="core/deck.core.css">
+
+  <!-- Extension CSS files go here. Remove or add as needed. -->
+  <link rel="stylesheet" media="screen" href="extensions/goto/deck.goto.css">
+  <link rel="stylesheet" media="screen" href="extensions/menu/deck.menu.css">
+  <link rel="stylesheet" media="screen" href="extensions/navigation/deck.navigation.css">
+  <link rel="stylesheet" media="screen" href="extensions/status/deck.status.css">
+  <link rel="stylesheet" media="screen" href="extensions/scale/deck.scale.css">
+
+  <!-- Style theme. More available in /themes/style/ or create your own. -->
+  <link rel="stylesheet" media="screen" href="themes/style/web-2.0.css">
+
+  <!-- Transition theme. More available in /themes/transition/ or create your own. -->
+  <link rel="stylesheet" media="screen" href="themes/transition/horizontal-slide.css">
+
+  <!-- Basic black and white print styles -->
+  <link rel="stylesheet" media="print" href="core/print.css">
+
+  <!-- Required Modernizr file -->
+  <script src="modernizr.custom.js"></script>
+</head>
+<body>
+  <div class="deck-container">
+
+    <!-- Begin slides. Just make elements with a class of slide. -->
+
+    <section class="slide">
+      <h1>Slide</h1>
+    </section>
+
+    <section class="slide">
+      <h1>Content</h1>
+    </section>
+
+    <section class="slide">
+      <h1>Here</h1>
+    </section>
+
+    <!-- End slides. -->
+
+    <!-- Begin extension snippets. Add or remove as needed. -->
+
+    <!-- deck.navigation snippet -->
+    <div aria-role="navigation">
+      <a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
+      <a href="#" class="deck-next-link" title="Next">&#8594;</a>
+    </div>
+
+    <!-- deck.status snippet -->
+    <p class="deck-status" aria-role="status">
+      <span class="deck-status-current"></span>
+      /
+      <span class="deck-status-total"></span>
+    </p>
+
+    <!-- deck.goto snippet -->
+    <form action="." method="get" class="goto-form">
+      <label for="goto-slide">Go to slide:</label>
+      <input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
+      <datalist id="goto-datalist"></datalist>
+      <input type="submit" value="Go">
+    </form>
+
+    <!-- End extension snippets. -->
+  </div>
+
+<!-- Required JS files. -->
+<script src="jquery.min.js"></script>
+<script src="core/deck.core.js"></script>
+
+<!-- Extension JS files. Add or remove as needed. -->
+<script src="extensions/menu/deck.menu.js"></script>
+<script src="extensions/goto/deck.goto.js"></script>
+<script src="extensions/status/deck.status.js"></script>
+<script src="extensions/navigation/deck.navigation.js"></script>
+<script src="extensions/scale/deck.scale.js"></script>
+
+<!-- Initialize the deck. You can put this in an external file if desired. -->
+<script>
+  $(function() {
+    $.deck('.slide');
+  });
+</script>
+</body>
+</html>
diff --git a/Tom-Marble/deck.js/core/deck.core.css b/Tom-Marble/deck.js/core/deck.core.css
new file mode 100644 (file)
index 0000000..da619cb
--- /dev/null
@@ -0,0 +1,60 @@
+html, body {
+  height: 100%;
+  padding: 0;
+  margin: 0;
+}
+
+.deck-container {
+  position: relative;
+  min-height: 100%;
+  margin: 0 auto;
+  overflow: hidden;
+  overflow-y: auto;
+}
+.js .deck-container {
+  visibility: hidden;
+}
+.ready .deck-container {
+  visibility: visible;
+}
+.touch .deck-container {
+  -webkit-text-size-adjust: none;
+  -moz-text-size-adjust: none;
+}
+
+.deck-loading {
+  display: none;
+}
+
+.slide {
+  width: auto;
+  min-height: 100%;
+  position: relative;
+}
+
+.deck-before, .deck-previous, .deck-next, .deck-after {
+  position: absolute;
+  left: -999em;
+  top: -999em;
+}
+
+.deck-current {
+  z-index: 2;
+}
+
+.slide .slide {
+  visibility: hidden;
+  position: static;
+  min-height: 0;
+}
+
+.deck-child-current {
+  position: static;
+  z-index: 2;
+}
+.deck-child-current .slide {
+  visibility: hidden;
+}
+.deck-child-current .deck-previous, .deck-child-current .deck-before, .deck-child-current .deck-current {
+  visibility: visible;
+}
diff --git a/Tom-Marble/deck.js/core/deck.core.js b/Tom-Marble/deck.js/core/deck.core.js
new file mode 100644 (file)
index 0000000..3979627
--- /dev/null
@@ -0,0 +1,753 @@
+/*!
+Deck JS - deck.core
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+The deck.core module provides all the basic functionality for creating and
+moving through a deck.  It does so by applying classes to indicate the state of
+the deck and its slides, allowing CSS to take care of the visual representation
+of each state.  It also provides methods for navigating the deck and inspecting
+its state, as well as basic key bindings for going to the next and previous
+slides.  More functionality is provided by wholly separate extension modules
+that use the API provided by core.
+*/
+(function($, undefined) {
+  var slides, currentIndex, $container, $fragmentLinks;
+
+  var events = {
+    /*
+    This event fires at the beginning of a slide change, before the actual
+    change occurs. Its purpose is to give extension authors a way to prevent
+    the slide change from occuring. This is done by calling preventDefault
+    on the event object within this event. If that is done, the deck.change
+    event will never be fired and the slide will not change.
+    */
+    beforeChange: 'deck.beforeChange',
+
+    /*
+    This event fires whenever the current slide changes, whether by way of
+    next, prev, or go. The callback function is passed two parameters, from
+    and to, equal to the indices of the old slide and the new slide
+    respectively. If preventDefault is called on the event within this handler
+    the slide change does not occur.
+
+    $(document).bind('deck.change', function(event, from, to) {
+       alert('Moving from slide ' + from + ' to ' + to);
+    });
+    */
+    change: 'deck.change',
+
+    /*
+    This event fires at the beginning of deck initialization. This event makes
+    a good hook for preprocessing extensions looking to modify the DOM before
+    the deck is fully initialized. It is also possible to halt the deck.init
+    event from firing while you do things in beforeInit. This can be done by
+    calling lockInit on the event object passed to this event. The init can be
+    released by calling releaseInit.
+
+    $(document).bind('deck.beforeInit', function(event) {
+      event.lockInit(); // halts deck.init event
+      window.setTimeout(function() {
+        event.releaseInit(); // deck.init will now fire 2 seconds later
+      }, 2000);
+    });
+
+    The init event will be fired regardless of locks after
+    options.initLockTimeout milliseconds.
+    */
+    beforeInitialize: 'deck.beforeInit',
+
+    /*
+    This event fires at the end of deck initialization. Extensions should
+    implement any code that relies on user extensible options (key bindings,
+    element selectors, classes) within a handler for this event. Native
+    events associated with Deck JS should be scoped under a .deck event
+    namespace, as with the example below:
+
+    var $d = $(document);
+    $.deck.defaults.keys.myExtensionKeycode = 70; // 'h'
+    $d.bind('deck.init', function() {
+       $d.bind('keydown.deck', function(event) {
+          if (event.which === $.deck.getOptions().keys.myExtensionKeycode) {
+             // Rock out
+          }
+       });
+    });
+    */
+    initialize: 'deck.init'
+  };
+
+  var options = {};
+  var $document = $(document);
+  var $window = $(window);
+  var stopPropagation = function(event) {
+    event.stopPropagation();
+  };
+
+  var updateContainerState = function() {
+    var oldIndex = $container.data('onSlide');
+    $container.removeClass(options.classes.onPrefix + oldIndex);
+    $container.addClass(options.classes.onPrefix + currentIndex);
+    $container.data('onSlide', currentIndex);
+  };
+
+  var updateChildCurrent = function() {
+    var $oldCurrent = $('.' + options.classes.current);
+    var $oldParents = $oldCurrent.parentsUntil(options.selectors.container);
+    var $newCurrent = slides[currentIndex];
+    var $newParents = $newCurrent.parentsUntil(options.selectors.container);
+    $oldParents.removeClass(options.classes.childCurrent);
+    $newParents.addClass(options.classes.childCurrent);
+  };
+
+  var removeOldSlideStates = function() {
+    var $all = $();
+    $.each(slides, function(i, el) {
+      $all = $all.add(el);
+    });
+    $all.removeClass([
+      options.classes.before,
+      options.classes.previous,
+      options.classes.current,
+      options.classes.next,
+      options.classes.after
+    ].join(' '));
+  };
+
+  var addNewSlideStates = function() {
+    slides[currentIndex].addClass(options.classes.current);
+    if (currentIndex > 0) {
+      slides[currentIndex-1].addClass(options.classes.previous);
+    }
+    if (currentIndex + 1 < slides.length) {
+      slides[currentIndex+1].addClass(options.classes.next);
+    }
+    if (currentIndex > 1) {
+      $.each(slides.slice(0, currentIndex - 1), function(i, $slide) {
+        $slide.addClass(options.classes.before);
+      });
+    }
+    if (currentIndex + 2 < slides.length) {
+      $.each(slides.slice(currentIndex+2), function(i, $slide) {
+        $slide.addClass(options.classes.after);
+      });
+    }
+  };
+
+  var setAriaHiddens = function() {
+    $(options.selectors.slides).each(function() {
+      var $slide = $(this);
+      var isSub = $slide.closest('.' + options.classes.childCurrent).length;
+      var isBefore = $slide.hasClass(options.classes.before) && !isSub;
+      var isPrevious = $slide.hasClass(options.classes.previous) && !isSub;
+      var isNext = $slide.hasClass(options.classes.next);
+      var isAfter = $slide.hasClass(options.classes.after);
+      var ariaHiddenValue = isBefore || isPrevious || isNext || isAfter;
+      $slide.attr('aria-hidden', ariaHiddenValue);
+    });
+  };
+
+  var updateStates = function() {
+    updateContainerState();
+    updateChildCurrent();
+    removeOldSlideStates();
+    addNewSlideStates();
+    if (options.setAriaHiddens) {
+      setAriaHiddens();
+    }
+  };
+
+  var initSlidesArray = function(elements) {
+    if ($.isArray(elements)) {
+      $.each(elements, function(i, element) {
+        slides.push($(element));
+      });
+    }
+    else {
+      $(elements).each(function(i, element) {
+        slides.push($(element));
+      });
+    }
+  };
+
+  var bindKeyEvents = function() {
+    var editables = [
+      'input',
+      'textarea',
+      'select',
+      'button',
+      'meter',
+      'progress',
+      '[contentEditable]'
+    ].join(', ');
+
+    $document.unbind('keydown.deck').bind('keydown.deck', function(event) {
+      if (event.altKey) {
+        // ignore events when the ALT key is down
+        // NB: browsers use ALT+arrow to navigate history
+        return;
+      }
+      var isNext = event.which === options.keys.next;
+      var isPrev = event.which === options.keys.previous;
+      isNext = isNext || $.inArray(event.which, options.keys.next) > -1;
+      isPrev = isPrev || $.inArray(event.which, options.keys.previous) > -1;
+
+      if (isNext) {
+        methods.next();
+        event.preventDefault();
+      }
+      else if (isPrev) {
+        methods.prev();
+        event.preventDefault();
+      }
+    });
+
+    $document.undelegate(editables, 'keydown.deck', stopPropagation);
+    $document.delegate(editables, 'keydown.deck', stopPropagation);
+  };
+
+  var bindTouchEvents = function() {
+    var startTouch;
+    var direction = options.touch.swipeDirection;
+    var tolerance = options.touch.swipeTolerance;
+    var listenToHorizontal = ({ both: true, horizontal: true })[direction];
+    var listenToVertical = ({ both: true, vertical: true })[direction];
+
+    $container.unbind('touchstart.deck');
+    $container.bind('touchstart.deck', function(event) {
+      if (!startTouch) {
+        startTouch = $.extend({}, event.originalEvent.targetTouches[0]);
+      }
+    });
+
+    $container.unbind('touchmove.deck');
+    $container.bind('touchmove.deck', function(event) {
+      $.each(event.originalEvent.changedTouches, function(i, touch) {
+        if (!startTouch || touch.identifier !== startTouch.identifier) {
+          return true;
+        }
+        var xDistance = touch.screenX - startTouch.screenX;
+        var yDistance = touch.screenY - startTouch.screenY;
+        var leftToRight = xDistance > tolerance && listenToHorizontal;
+        var rightToLeft = xDistance < -tolerance && listenToHorizontal;
+        var topToBottom = yDistance > tolerance && listenToVertical;
+        var bottomToTop = yDistance < -tolerance && listenToVertical;
+
+        if (leftToRight || topToBottom) {
+          $.deck('prev');
+          startTouch = undefined;
+        }
+        else if (rightToLeft || bottomToTop) {
+          $.deck('next');
+          startTouch = undefined;
+        }
+        return false;
+      });
+
+      if (listenToVertical) {
+        event.preventDefault();
+      }
+    });
+
+    $container.unbind('touchend.deck');
+    $container.bind('touchend.deck', function(event) {
+      $.each(event.originalEvent.changedTouches, function(i, touch) {
+        if (startTouch && touch.identifier === startTouch.identifier) {
+          startTouch = undefined;
+        }
+      });
+    });
+  };
+
+  var indexInBounds = function(index) {
+    return typeof index === 'number' && index >=0 && index < slides.length;
+  };
+
+  var createBeforeInitEvent = function() {
+    var event = $.Event(events.beforeInitialize);
+    event.locks = 0;
+    event.done = $.noop;
+    event.lockInit = function() {
+      ++event.locks;
+    };
+    event.releaseInit = function() {
+      --event.locks;
+      if (!event.locks) {
+        event.done();
+      }
+    };
+    return event;
+  };
+
+  var goByHash = function(str) {
+    var id = str.substr(str.indexOf("#") + 1);
+
+    $.each(slides, function(i, $slide) {
+      if ($slide.attr('id') === id) {
+        $.deck('go', i);
+        return false;
+      }
+    });
+
+    // If we don't set these to 0 the container scrolls due to hashchange
+    if (options.preventFragmentScroll) {
+      $.deck('getContainer').scrollLeft(0).scrollTop(0);
+    }
+  };
+
+  var assignSlideId = function(i, $slide) {
+    var currentId = $slide.attr('id');
+    var previouslyAssigned = $slide.data('deckAssignedId') === currentId;
+    if (!currentId || previouslyAssigned) {
+      $slide.attr('id', options.hashPrefix + i);
+      $slide.data('deckAssignedId', options.hashPrefix + i);
+    }
+  };
+
+  var removeContainerHashClass = function(id) {
+    $container.removeClass(options.classes.onPrefix + id);
+  };
+
+  var addContainerHashClass = function(id) {
+    $container.addClass(options.classes.onPrefix + id);
+  };
+
+  var setupHashBehaviors = function() {
+    $fragmentLinks = $();
+    $.each(slides, function(i, $slide) {
+      var hash;
+
+      assignSlideId(i, $slide);
+      hash = '#' + $slide.attr('id');
+      if (hash === window.location.hash) {
+        setTimeout(function() {
+          $.deck('go', i);
+        }, 1);
+      }
+      $fragmentLinks = $fragmentLinks.add('a[href="' + hash + '"]');
+    });
+
+    if (slides.length) {
+      addContainerHashClass($.deck('getSlide').attr('id'));
+    };
+  };
+
+  var changeHash = function(from, to) {
+    var hash = '#' + $.deck('getSlide', to).attr('id');
+    var hashPath = window.location.href.replace(/#.*/, '') + hash;
+
+    removeContainerHashClass($.deck('getSlide', from).attr('id'));
+    addContainerHashClass($.deck('getSlide', to).attr('id'));
+    if (Modernizr.history) {
+      window.history.replaceState({}, "", hashPath);
+    }
+  };
+
+  /* Methods exposed in the jQuery.deck namespace */
+  var methods = {
+
+    /*
+    jQuery.deck(selector, options)
+
+    selector: string | jQuery | array
+    options: object, optional
+
+    Initializes the deck, using each element matched by selector as a slide.
+    May also be passed an array of string selectors or jQuery objects, in
+    which case each selector in the array is considered a slide. The second
+    parameter is an optional options object which will extend the default
+    values.
+
+    Users may also pass only an options object to init. In this case the slide
+    selector will be options.selectors.slides which defaults to .slide.
+
+    $.deck('.slide');
+
+    or
+
+    $.deck([
+       '#first-slide',
+       '#second-slide',
+       '#etc'
+    ]);
+    */
+    init: function(opts) {
+      var beforeInitEvent = createBeforeInitEvent();
+      var overrides = opts;
+
+      if (!$.isPlainObject(opts)) {
+        overrides = arguments[1] || {};
+        $.extend(true, overrides, {
+          selectors: {
+            slides: arguments[0]
+          }
+        });
+      }
+
+      options = $.extend(true, {}, $.deck.defaults, overrides);
+      slides = [];
+      currentIndex = 0;
+      $container = $(options.selectors.container);
+
+      // Hide the deck while states are being applied to kill transitions
+      $container.addClass(options.classes.loading);
+
+      // populate the array of slides for pre-init
+      initSlidesArray(options.selectors.slides);
+      // Pre init event for preprocessing hooks
+      beforeInitEvent.done = function() {
+        // re-populate the array of slides
+        slides = [];
+        initSlidesArray(options.selectors.slides);
+        setupHashBehaviors();
+        bindKeyEvents();
+        bindTouchEvents();
+        $container.scrollLeft(0).scrollTop(0);
+
+        if (slides.length) {
+          updateStates();
+        }
+
+        // Show deck again now that slides are in place
+        $container.removeClass(options.classes.loading);
+        $document.trigger(events.initialize);
+      };
+
+      $document.trigger(beforeInitEvent);
+      if (!beforeInitEvent.locks) {
+        beforeInitEvent.done();
+      }
+      window.setTimeout(function() {
+        if (beforeInitEvent.locks) {
+          if (window.console) {
+            window.console.warn('Something locked deck initialization\
+              without releasing it before the timeout. Proceeding with\
+              initialization anyway.');
+          }
+          beforeInitEvent.done();
+        }
+      }, options.initLockTimeout);
+    },
+
+    /*
+    jQuery.deck('go', index)
+
+    index: integer | string
+
+    Moves to the slide at the specified index if index is a number. Index is
+    0-based, so $.deck('go', 0); will move to the first slide. If index is a
+    string this will move to the slide with the specified id. If index is out
+    of bounds or doesn't match a slide id the call is ignored.
+    */
+    go: function(indexOrId) {
+      var beforeChangeEvent = $.Event(events.beforeChange);
+      var index;
+
+      /* Number index, easy. */
+      if (indexInBounds(indexOrId)) {
+        index = indexOrId;
+      }
+      /* Id string index, search for it and set integer index */
+      else if (typeof indexOrId === 'string') {
+        $.each(slides, function(i, $slide) {
+          if ($slide.attr('id') === indexOrId) {
+            index = i;
+            return false;
+          }
+        });
+      }
+      if (typeof index === 'undefined') {
+        return;
+      }
+
+      /* Trigger beforeChange. If nothing prevents the change, trigger
+      the slide change. */
+      $document.trigger(beforeChangeEvent, [currentIndex, index]);
+      if (!beforeChangeEvent.isDefaultPrevented()) {
+        $document.trigger(events.change, [currentIndex, index]);
+        changeHash(currentIndex, index);
+        currentIndex = index;
+        updateStates();
+      }
+    },
+
+    /*
+    jQuery.deck('next')
+
+    Moves to the next slide. If the last slide is already active, the call
+    is ignored.
+    */
+    next: function() {
+      methods.go(currentIndex+1);
+    },
+
+    /*
+    jQuery.deck('prev')
+
+    Moves to the previous slide. If the first slide is already active, the
+    call is ignored.
+    */
+    prev: function() {
+      methods.go(currentIndex-1);
+    },
+
+    /*
+    jQuery.deck('getSlide', index)
+
+    index: integer, optional
+
+    Returns a jQuery object containing the slide at index. If index is not
+    specified, the current slide is returned.
+    */
+    getSlide: function(index) {
+      index = typeof index !== 'undefined' ? index : currentIndex;
+      if (!indexInBounds(index)) {
+        return null;
+      }
+      return slides[index];
+    },
+
+    /*
+    jQuery.deck('getSlides')
+
+    Returns all slides as an array of jQuery objects.
+    */
+    getSlides: function() {
+      return slides;
+    },
+
+    /*
+    jQuery.deck('getTopLevelSlides')
+
+    Returns all slides that are not subslides.
+    */
+    getTopLevelSlides: function() {
+      var topLevelSlides = [];
+      var slideSelector = options.selectors.slides;
+      var subSelector = [slideSelector, slideSelector].join(' ');
+      $.each(slides, function(i, $slide) {
+        if (!$slide.is(subSelector)) {
+          topLevelSlides.push($slide);
+        }
+      });
+      return topLevelSlides;
+    },
+
+    /*
+    jQuery.deck('getNestedSlides', index)
+
+    index: integer, optional
+
+    Returns all the nested slides of the current slide. If index is
+    specified it returns the nested slides of the slide at that index.
+    If there are no nested slides this will return an empty array.
+    */
+    getNestedSlides: function(index) {
+      var targetIndex = index == null ? currentIndex : index;
+      var $targetSlide = $.deck('getSlide', targetIndex);
+      var $nesteds = $targetSlide.find(options.selectors.slides);
+      var nesteds = $nesteds.get();
+      return $.map(nesteds, function(slide, i) {
+        return $(slide);
+      });
+    },
+
+
+    /*
+    jQuery.deck('getContainer')
+
+    Returns a jQuery object containing the deck container as defined by the
+    container option.
+    */
+    getContainer: function() {
+      return $container;
+    },
+
+    /*
+    jQuery.deck('getOptions')
+
+    Returns the options object for the deck, including any overrides that
+    were defined at initialization.
+    */
+    getOptions: function() {
+      return options;
+    },
+
+    /*
+    jQuery.deck('extend', name, method)
+
+    name: string
+    method: function
+
+    Adds method to the deck namespace with the key of name. This doesn’t
+    give access to any private member data — public methods must still be
+    used within method — but lets extension authors piggyback on the deck
+    namespace rather than pollute jQuery.
+
+    $.deck('extend', 'alert', function(msg) {
+       alert(msg);
+    });
+
+    // Alerts 'boom'
+    $.deck('alert', 'boom');
+    */
+    extend: function(name, method) {
+      methods[name] = method;
+    }
+  };
+
+  /* jQuery extension */
+  $.deck = function(method, arg) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    if (methods[method]) {
+      return methods[method].apply(this, args);
+    }
+    else {
+      return methods.init(method, arg);
+    }
+  };
+
+  /*
+  The default settings object for a deck. All deck extensions should extend
+  this object to add defaults for any of their options.
+
+  options.classes.after
+    This class is added to all slides that appear after the 'next' slide.
+
+  options.classes.before
+    This class is added to all slides that appear before the 'previous'
+    slide.
+
+  options.classes.childCurrent
+    This class is added to all elements in the DOM tree between the
+    'current' slide and the deck container. For standard slides, this is
+    mostly seen and used for nested slides.
+
+  options.classes.current
+    This class is added to the current slide.
+
+  options.classes.loading
+    This class is applied to the deck container during loading phases and is
+    primarily used as a way to short circuit transitions between states
+    where such transitions are distracting or unwanted.  For example, this
+    class is applied during deck initialization and then removed to prevent
+    all the slides from appearing stacked and transitioning into place
+    on load.
+
+  options.classes.next
+    This class is added to the slide immediately following the 'current'
+    slide.
+
+  options.classes.onPrefix
+    This prefix, concatenated with the current slide index, is added to the
+    deck container as you change slides.
+
+  options.classes.previous
+    This class is added to the slide immediately preceding the 'current'
+    slide.
+
+  options.selectors.container
+    Elements matched by this CSS selector will be considered the deck
+    container. The deck container is used to scope certain states of the
+    deck, as with the onPrefix option, or with extensions such as deck.goto
+    and deck.menu.
+
+  options.selectors.slides
+    Elements matched by this selector make up the individual deck slides.
+    If a user chooses to pass the slide selector as the first argument to
+    $.deck() on initialization it does the same thing as passing in this
+    option and this option value will be set to the value of that parameter.
+
+  options.keys.next
+    The numeric keycode used to go to the next slide.
+
+  options.keys.previous
+    The numeric keycode used to go to the previous slide.
+
+  options.touch.swipeDirection
+    The direction swipes occur to cause slide changes. Can be 'horizontal',
+    'vertical', or 'both'. Any other value or a falsy value will disable
+    swipe gestures for navigation.
+
+  options.touch.swipeTolerance
+    The number of pixels the users finger must travel to produce a swipe
+    gesture.
+
+  options.initLockTimeout
+    The number of milliseconds the init event will wait for BeforeInit event
+    locks to be released before firing the init event regardless.
+
+  options.hashPrefix
+    Every slide that does not have an id is assigned one at initialization.
+    Assigned ids take the form of hashPrefix + slideIndex, e.g., slide-0,
+    slide-12, etc.
+
+  options.preventFragmentScroll
+    When deep linking to a hash of a nested slide, this scrolls the deck
+    container to the top, undoing the natural browser behavior of scrolling
+    to the document fragment on load.
+
+  options.setAriaHiddens
+    When set to true, deck.js will set aria hidden attributes for slides
+    that do not appear onscreen according to a typical heirarchical
+    deck structure. You may want to turn this off if you are using a theme
+    where slides besides the current slide are visible on screen and should
+    be accessible to screenreaders.
+  */
+  $.deck.defaults = {
+    classes: {
+      after: 'deck-after',
+      before: 'deck-before',
+      childCurrent: 'deck-child-current',
+      current: 'deck-current',
+      loading: 'deck-loading',
+      next: 'deck-next',
+      onPrefix: 'on-slide-',
+      previous: 'deck-previous'
+    },
+
+    selectors: {
+      container: '.deck-container',
+      slides: '.slide'
+    },
+
+    keys: {
+      // enter, space, page down, right arrow, down arrow,
+      next: [13, 32, 34, 39, 40],
+      // backspace, page up, left arrow, up arrow
+      previous: [8, 33, 37, 38]
+    },
+
+    touch: {
+      swipeDirection: 'horizontal',
+      swipeTolerance: 60
+    },
+
+    initLockTimeout: 10000,
+    hashPrefix: 'slide-',
+    preventFragmentScroll: true,
+    setAriaHiddens: true
+  };
+
+  $document.ready(function() {
+    $('html').addClass('ready');
+  });
+
+  $window.bind('hashchange.deck', function(event) {
+    if (event.originalEvent && event.originalEvent.newURL) {
+      goByHash(event.originalEvent.newURL);
+    }
+    else {
+      goByHash(window.location.hash);
+    }
+  });
+
+  $window.bind('load.deck', function() {
+    if (options.preventFragmentScroll) {
+      $container.scrollLeft(0).scrollTop(0);
+    }
+  });
+})(jQuery);
diff --git a/Tom-Marble/deck.js/core/deck.core.scss b/Tom-Marble/deck.js/core/deck.core.scss
new file mode 100755 (executable)
index 0000000..baab0fd
--- /dev/null
@@ -0,0 +1,65 @@
+html, body {
+  height:100%;
+  padding:0;
+  margin:0;
+}
+
+.deck-container {
+  position:relative;
+  min-height:100%;
+  margin:0 auto;
+  overflow:hidden;
+  overflow-y:auto;
+
+  .js & {
+    visibility:hidden;
+  }
+
+  .ready & {
+    visibility:visible;
+  }
+
+  .touch & {
+    -webkit-text-size-adjust:none;
+    -moz-text-size-adjust:none;
+  }
+}
+
+.deck-loading {
+  display:none;
+}
+
+.slide {
+  width:auto;
+  min-height:100%;
+  position:relative;
+}
+
+.deck-before, .deck-previous, .deck-next, .deck-after {
+  position:absolute;
+  left:-999em;
+  top:-999em;
+}
+
+.deck-current {
+  z-index:2;
+}
+
+.slide .slide {
+  visibility:hidden;
+  position:static;
+  min-height:0;
+}
+
+.deck-child-current {
+  position:static;
+  z-index:2;
+
+  .slide {
+    visibility:hidden;
+  }
+
+  .deck-previous, .deck-before, .deck-current {
+    visibility:visible;
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/core/print.css b/Tom-Marble/deck.js/core/print.css
new file mode 100644 (file)
index 0000000..0230f4c
--- /dev/null
@@ -0,0 +1,25 @@
+body {
+  font-size: 18pt;
+}
+
+h1 {
+  font-size: 48pt;
+}
+
+h2 {
+  font-size: 36pt;
+}
+
+h3 {
+  font-size: 28pt;
+}
+
+pre {
+  border: 1px solid #000;
+  padding: 10px;
+  white-space: pre-wrap;
+}
+
+.deck-container > .slide {
+  page-break-after: always;
+}
diff --git a/Tom-Marble/deck.js/core/print.scss b/Tom-Marble/deck.js/core/print.scss
new file mode 100644 (file)
index 0000000..02acd4b
--- /dev/null
@@ -0,0 +1,14 @@
+body { font-size:18pt; }
+h1 { font-size:48pt; }
+h2 { font-size:36pt; }
+h3 { font-size:28pt; }
+
+pre {
+  border:1px solid #000;
+  padding:10px;
+  white-space:pre-wrap;
+}
+
+.deck-container > .slide {
+  page-break-after: always;
+}
diff --git a/Tom-Marble/deck.js/extensions/goto/deck.goto.css b/Tom-Marble/deck.js/extensions/goto/deck.goto.css
new file mode 100644 (file)
index 0000000..935574a
--- /dev/null
@@ -0,0 +1,36 @@
+.goto-form {
+  position: absolute;
+  z-index: 3;
+  bottom: 10px;
+  left: 50%;
+  height: 1.75em;
+  margin: 0 0 0 -9.125em;
+  line-height: 1.75em;
+  padding: 0.625em;
+  display: none;
+  background: #ccc;
+  overflow: hidden;
+  border-radius: 10px;
+}
+.goto-form label {
+  font-weight: bold;
+}
+.goto-form label, .goto-form input {
+  display: inline-block;
+  font-family: inherit;
+}
+.deck-goto .goto-form {
+  display: block;
+}
+
+#goto-slide {
+  width: 8.375em;
+  margin: 0 0.625em;
+  height: 1.4375em;
+}
+
+@media print {
+  .goto-form, #goto-slide {
+    display: none;
+  }
+}
diff --git a/Tom-Marble/deck.js/extensions/goto/deck.goto.html b/Tom-Marble/deck.js/extensions/goto/deck.goto.html
new file mode 100644 (file)
index 0000000..4b73998
--- /dev/null
@@ -0,0 +1,7 @@
+<!-- Place the following snippet at the bottom of the deck container. -->
+<form action="." method="get" class="goto-form">
+  <label for="goto-slide">Go to slide:</label>
+  <input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
+  <datalist id="goto-datalist"></datalist>
+  <input type="submit" value="Go">
+</form>
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/extensions/goto/deck.goto.js b/Tom-Marble/deck.js/extensions/goto/deck.goto.js
new file mode 100644 (file)
index 0000000..6a90f16
--- /dev/null
@@ -0,0 +1,190 @@
+/*!
+Deck JS - deck.goto
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+This module adds the necessary methods and key bindings to show and hide a form
+for jumping to any slide number/id in the deck (and processes that form
+accordingly). The form-showing state is indicated by the presence of a class on
+the deck container.
+*/
+(function($, undefined) {
+  var $document = $(document);
+  var rootCounter;
+
+  var bindKeyEvents = function() {
+    $document.unbind('keydown.deckgoto');
+    $document.bind('keydown.deckgoto', function(event) {
+      var key = $.deck('getOptions').keys.goto;
+      if (event.which === key || $.inArray(event.which, key) > -1) {
+        event.preventDefault();
+        $.deck('toggleGoTo');
+      }
+    });
+  };
+
+  var populateDatalist = function() {
+    var options = $.deck('getOptions');
+    var $datalist = $(options.selectors.gotoDatalist);
+
+    $.each($.deck('getSlides'), function(i, $slide) {
+      var id = $slide.attr('id');
+      if (id) {
+        $datalist.append('<option value="' + id + '">');
+      }
+    });
+  };
+
+  var markRootSlides = function() {
+    var options = $.deck('getOptions');
+    var slideTest = $.map([
+      options.classes.before,
+      options.classes.previous,
+      options.classes.current,
+      options.classes.next,
+      options.classes.after
+    ], function(el, i) {
+      return '.' + el;
+    }).join(', ');
+
+    rootCounter = 0;
+    $.each($.deck('getSlides'), function(i, $slide) {
+      var $parentSlides = $slide.parentsUntil(
+        options.selectors.container,
+        slideTest
+      );
+
+      if ($parentSlides.length) {
+        $slide.removeData('rootIndex');
+      }
+      else if (!options.countNested) {
+        ++rootCounter;
+        $slide.data('rootIndex', rootCounter);
+      }
+    });
+  };
+
+  var handleFormSubmit = function() {
+    var options = $.deck('getOptions');
+    var $form = $(options.selectors.gotoForm);
+
+    $form.unbind('submit.deckgoto');
+    $form.bind('submit.deckgoto', function(event) {
+      var $field = $(options.selectors.gotoInput);
+      var indexOrId = $field.val();
+      var index = parseInt(indexOrId, 10);
+
+      if (!options.countNested) {
+        if (!isNaN(index) && index >= rootCounter) {
+          return false;
+        }
+        $.each($.deck('getSlides'), function(i, $slide) {
+          if ($slide.data('rootIndex') === index) {
+            index = i + 1;
+            return false;
+          }
+        });
+      }
+
+      $.deck('go', isNaN(index) ? indexOrId : index - 1);
+      $.deck('hideGoTo');
+      $field.val('');
+      event.preventDefault();
+    });
+  };
+
+  /*
+  Extends defaults/options.
+
+  options.classes.goto
+    This class is added to the deck container when showing the Go To Slide
+    form.
+
+  options.selectors.gotoDatalist
+    The element that matches this selector is the datalist element that will
+    be populated with options for each of the slide ids.  In browsers that
+    support the datalist element, this provides a drop list of slide ids to
+    aid the user in selecting a slide.
+
+  options.selectors.gotoForm
+    The element that matches this selector is the form that is submitted
+    when a user hits enter after typing a slide number/id in the gotoInput
+    element.
+
+  options.selectors.gotoInput
+    The element that matches this selector is the text input field for
+    entering a slide number/id in the Go To Slide form.
+
+  options.keys.goto
+    The numeric keycode used to show the Go To Slide form.
+
+  options.countNested
+    If false, only top level slides will be counted when entering a
+    slide number.
+  */
+  $.extend(true, $.deck.defaults, {
+    classes: {
+      goto: 'deck-goto'
+    },
+
+    selectors: {
+      gotoDatalist: '#goto-datalist',
+      gotoForm: '.goto-form',
+      gotoInput: '#goto-slide'
+    },
+
+    keys: {
+      goto: 71 // g
+    },
+
+    countNested: true
+  });
+
+  /*
+  jQuery.deck('showGoTo')
+
+  Shows the Go To Slide form by adding the class specified by the goto class
+  option to the deck container.
+  */
+  $.deck('extend', 'showGoTo', function() {
+    var options = $.deck('getOptions');
+    $.deck('getContainer').addClass(options.classes.goto);
+    $(options.selectors.gotoForm).attr('aria-hidden', false);
+    $(options.selectors.gotoInput).focus();
+  });
+
+  /*
+  jQuery.deck('hideGoTo')
+
+  Hides the Go To Slide form by removing the class specified by the goto class
+  option from the deck container.
+  */
+  $.deck('extend', 'hideGoTo', function() {
+    var options = $.deck('getOptions');
+    $(options.selectors.gotoInput).blur();
+    $.deck('getContainer').removeClass(options.classes.goto);
+    $(options.selectors.gotoForm).attr('aria-hidden', true);
+  });
+
+  /*
+  jQuery.deck('toggleGoTo')
+
+  Toggles between showing and hiding the Go To Slide form.
+  */
+  $.deck('extend', 'toggleGoTo', function() {
+    var options = $.deck('getOptions');
+    var hasGotoClass = $.deck('getContainer').hasClass(options.classes.goto);
+    $.deck(hasGotoClass ? 'hideGoTo' : 'showGoTo');
+  });
+
+  $document.bind('deck.init', function() {
+    bindKeyEvents();
+    populateDatalist();
+    markRootSlides();
+    handleFormSubmit();
+  });
+})(jQuery);
+
diff --git a/Tom-Marble/deck.js/extensions/goto/deck.goto.scss b/Tom-Marble/deck.js/extensions/goto/deck.goto.scss
new file mode 100755 (executable)
index 0000000..667219f
--- /dev/null
@@ -0,0 +1,39 @@
+.goto-form {
+  position:absolute;
+  z-index:3;
+  bottom:10px;
+  left:50%;
+  height:1.75em;
+  margin:0 0 0 -9.125em;
+  line-height:1.75em;
+  padding:0.625em;
+  display:none;
+  background:#ccc;
+  overflow:hidden;
+  border-radius:10px;
+
+  label {
+    font-weight:bold;
+  }
+
+  label, input {
+    display:inline-block;
+    font-family:inherit;
+  }
+
+  .deck-goto & {
+    display:block;
+  }
+}
+
+#goto-slide {
+  width:8.375em;
+  margin:0 0.625em;
+  height:1.4375em;
+}
+
+@media print {
+  .goto-form, #goto-slide {
+    display:none;
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/extensions/menu/deck.menu.css b/Tom-Marble/deck.js/extensions/menu/deck.menu.css
new file mode 100644 (file)
index 0000000..a0f4e00
--- /dev/null
@@ -0,0 +1,45 @@
+.deck-menu {
+  overflow: auto;
+}
+.deck-menu .slide {
+  background: #eee;
+  position: relative;
+  left: 0;
+  top: 0;
+  visibility: visible;
+  cursor: pointer;
+}
+.no-csstransforms .deck-menu > .slide {
+  float: left;
+  width: 22%;
+  height: 22%;
+  min-height: 0;
+  margin: 1%;
+  font-size: 0.22em;
+  overflow: hidden;
+  padding: 0 0.5%;
+}
+.csstransforms .deck-menu > .slide {
+  -webkit-transform: scale(0.22) !important;
+  -ms-transform: scale(0.22) !important;
+  transform: scale(0.22) !important;
+  -webkit-transform-origin: 0 0;
+  -ms-transform-origin: 0 0;
+  transform-origin: 0 0;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  padding: 0 48px;
+  margin: 12px;
+}
+.deck-menu iframe, .deck-menu img, .deck-menu video {
+  max-width: 100%;
+}
+.deck-menu .deck-current, .no-touch .deck-menu .slide:hover {
+  background: #ddf;
+}
+.deck-menu.deck-container:hover .deck-prev-link, .deck-menu.deck-container:hover .deck-next-link {
+  display: none;
+}
diff --git a/Tom-Marble/deck.js/extensions/menu/deck.menu.js b/Tom-Marble/deck.js/extensions/menu/deck.menu.js
new file mode 100644 (file)
index 0000000..77cf8c5
--- /dev/null
@@ -0,0 +1,225 @@
+/*!
+Deck JS - deck.menu
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+This module adds the methods and key binding to show and hide a menu of all
+slides in the deck. The deck menu state is indicated by the presence of a class
+on the deck container.
+*/
+(function($, undefined) {
+  var $document = $(document);
+  var $html = $('html');
+  var rootSlides;
+
+  var populateRootSlidesArray = function() {
+    var options = $.deck('getOptions');
+    var slideTest = $.map([
+      options.classes.before,
+      options.classes.previous,
+      options.classes.current,
+      options.classes.next,
+      options.classes.after
+    ], function(el, i) {
+      return '.' + el;
+    }).join(', ');
+
+    rootSlides = [];
+    $.each($.deck('getSlides'), function(i, $slide) {
+      var $parentSlides = $slide.parentsUntil(
+        options.selectors.container,
+        slideTest
+      );
+      if (!$parentSlides.length) {
+        rootSlides.push($slide);
+      }
+    });
+  };
+
+  var bindKeyEvents = function() {
+    var options = $.deck('getOptions');
+    $document.unbind('keydown.deckmenu');
+    $document.bind('keydown.deckmenu', function(event) {
+      var isMenuKey = event.which === options.keys.menu;
+      isMenuKey = isMenuKey || $.inArray(event.which, options.keys.menu) > -1;
+      if (isMenuKey && !event.ctrlKey) {
+        $.deck('toggleMenu');
+        event.preventDefault();
+      }
+    });
+  };
+
+  var bindTouchEvents = function() {
+    var $container = $.deck('getContainer');
+    var options = $.deck('getOptions');
+    var touchEndTime = 0;
+    var currentSlide;
+
+    $container.unbind('touchstart.deckmenu');
+    $container.bind('touchstart.deckmenu', function() {
+      currentSlide = $.deck('getSlide');
+    });
+    $container.unbind('touchend.deckmenu');
+    $container.bind('touchend.deckmenu', function(event) {
+      var now = Date.now();
+      var isDoubletap = now - touchEndTime < options.touch.doubletapWindow;
+
+      // Ignore this touch event if it caused a nav change (swipe)
+      if (currentSlide !== $.deck('getSlide')) {
+        return;
+      }
+      if (isDoubletap) {
+        $.deck('toggleMenu');
+        event.preventDefault();
+      }
+      touchEndTime = now;
+    });
+  };
+
+  var setupMenuSlideSelection = function() {
+    var options = $.deck('getOptions');
+
+    $.each($.deck('getSlides'), function(i, $slide) {
+      $slide.unbind('click.deckmenu');
+      $slide.bind('click.deckmenu', function(event) {
+        if (!$.deck('getContainer').hasClass(options.classes.menu)) {
+          return;
+        }
+        $.deck('go', i);
+        $.deck('hideMenu');
+        event.stopPropagation();
+        event.preventDefault();
+      });
+    });
+  };
+
+  /*
+  Extends defaults/options.
+
+  options.classes.menu
+    This class is added to the deck container when showing the slide menu.
+
+  options.keys.menu
+    The numeric keycode used to toggle between showing and hiding the slide
+    menu.
+
+  options.touch.doubletapWindow
+    Two consecutive touch events within this number of milliseconds will
+    be considered a double tap, and will toggle the menu on touch devices.
+  */
+  $.extend(true, $.deck.defaults, {
+    classes: {
+      menu: 'deck-menu'
+    },
+
+    keys: {
+      menu: 77 // m
+    },
+
+    touch: {
+      doubletapWindow: 400
+    }
+  });
+
+  /*
+  jQuery.deck('showMenu')
+
+  Shows the slide menu by adding the class specified by the menu class option
+  to the deck container.
+  */
+  $.deck('extend', 'showMenu', function() {
+    var $container = $.deck('getContainer');
+    var options = $.deck('getOptions');
+
+    if ($container.hasClass(options.classes.menu)) {
+      return;
+    }
+
+    // Hide through loading class to short-circuit transitions (perf)
+    $container.addClass([
+      options.classes.loading,
+      options.classes.menu
+    ].join(' '));
+
+    /* Forced to do this in JS until CSS learns second-grade math. Save old
+    style value for restoration when menu is hidden. */
+    if (Modernizr.csstransforms) {
+      $.each(rootSlides, function(i, $slide) {
+        $slide.data('oldStyle', $slide.attr('style'));
+        $slide.css({
+          'position': 'absolute',
+          'left': ((i % 4) * 25) + '%',
+          'top': (Math.floor(i / 4) * 25) + '%'
+        });
+      });
+    }
+
+    // Need to ensure the loading class renders first, then remove
+    window.setTimeout(function() {
+      $container.removeClass(options.classes.loading);
+      $container.scrollTop($.deck('getSlide').position().top);
+    }, 0);
+  });
+
+  /*
+  jQuery.deck('hideMenu')
+
+  Hides the slide menu by removing the class specified by the menu class
+  option from the deck container.
+  */
+  $.deck('extend', 'hideMenu', function() {
+    var $container = $.deck('getContainer');
+    var options = $.deck('getOptions');
+
+    if (!$container.hasClass(options.classes.menu)) {
+      return;
+    }
+
+    $container.removeClass(options.classes.menu);
+    $container.addClass(options.classes.loading);
+
+    /* Restore old style value */
+    if (Modernizr.csstransforms) {
+      $.each(rootSlides, function(i, $slide) {
+        var oldStyle = $slide.data('oldStyle');
+        $slide.attr('style', oldStyle ? oldStyle : '');
+      });
+    }
+
+    window.setTimeout(function() {
+      $container.removeClass(options.classes.loading);
+      $container.scrollTop(0);
+    }, 0);
+  });
+
+  /*
+  jQuery.deck('toggleMenu')
+
+  Toggles between showing and hiding the slide menu.
+  */
+  $.deck('extend', 'toggleMenu', function() {
+    $.deck('getContainer').hasClass($.deck('getOptions').classes.menu) ?
+    $.deck('hideMenu') : $.deck('showMenu');
+  });
+
+  $document.bind('deck.init', function() {
+    populateRootSlidesArray();
+    bindKeyEvents();
+    bindTouchEvents();
+    setupMenuSlideSelection();
+  });
+
+  $document.bind('deck.change', function(event, from, to) {
+    var $container = $.deck('getContainer');
+    var containerScroll, slideTop;
+
+    if ($container.hasClass($.deck('getOptions').classes.menu)) {
+      containerScroll = $container.scrollTop();
+      slideTop = $.deck('getSlide', to).position().top;
+      $container.scrollTop(containerScroll + slideTop);
+    }
+  });
+})(jQuery);
diff --git a/Tom-Marble/deck.js/extensions/menu/deck.menu.scss b/Tom-Marble/deck.js/extensions/menu/deck.menu.scss
new file mode 100755 (executable)
index 0000000..2c6b3ae
--- /dev/null
@@ -0,0 +1,55 @@
+.deck-menu {
+  overflow:auto;
+
+  .slide {
+    background:#eee;
+    position:relative;
+    left:0;
+    top:0;
+    visibility:visible;
+    cursor:pointer;
+  }
+
+  > .slide {
+    .no-csstransforms & {
+      float:left;
+      width:22%;
+      height:22%;
+      min-height:0;
+      margin:1%;
+      font-size:0.22em;
+      overflow:hidden;
+      padding:0 0.5%;
+    }
+
+    .csstransforms & {
+      -webkit-transform:scale(.22) !important;
+      -ms-transform:scale(.22) !important;
+      transform:scale(.22) !important;
+      -webkit-transform-origin:0 0;
+      -ms-transform-origin:0 0;
+      transform-origin:0 0;
+      -moz-box-sizing: border-box;
+      box-sizing: border-box;
+      width:100%;
+      height:100%;
+      overflow:hidden;
+      padding:0 48px;
+      margin:12px;
+    }
+  }
+
+  iframe, img, video {
+    max-width:100%;
+  }
+
+  .deck-current, .no-touch & .slide:hover {
+    background:#ddf;
+  }
+
+  &.deck-container:hover {
+    .deck-prev-link, .deck-next-link {
+      display:none;
+    }
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/extensions/navigation/deck.navigation.css b/Tom-Marble/deck.js/extensions/navigation/deck.navigation.css
new file mode 100644 (file)
index 0000000..02ff718
--- /dev/null
@@ -0,0 +1,42 @@
+.deck-prev-link, .deck-next-link {
+  display: none;
+  position: absolute;
+  z-index: 3;
+  top: 50%;
+  width: 32px;
+  height: 32px;
+  margin-top: -16px;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 32px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  color: #fff;
+  background: #888;
+  border-radius: 16px;
+}
+.deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited {
+  color: #fff;
+}
+
+.deck-prev-link {
+  left: 8px;
+}
+
+.deck-next-link {
+  right: 8px;
+}
+
+.deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link {
+  display: block;
+}
+.deck-container:hover .deck-prev-link.deck-nav-disabled, .touch .deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link.deck-nav-disabled, .touch .deck-container:hover .deck-next-link {
+  display: none;
+}
+
+@media print {
+  .deck-prev-link, .deck-next-link {
+    display: none !important;
+  }
+}
diff --git a/Tom-Marble/deck.js/extensions/navigation/deck.navigation.html b/Tom-Marble/deck.js/extensions/navigation/deck.navigation.html
new file mode 100644 (file)
index 0000000..5237f4a
--- /dev/null
@@ -0,0 +1,5 @@
+<!-- Place the following snippet at the bottom of the deck container. -->
+<div aria-role="navigation">
+  <a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
+  <a href="#" class="deck-next-link" title="Next">&#8594;</a>
+</div>
diff --git a/Tom-Marble/deck.js/extensions/navigation/deck.navigation.js b/Tom-Marble/deck.js/extensions/navigation/deck.navigation.js
new file mode 100644 (file)
index 0000000..7dc9510
--- /dev/null
@@ -0,0 +1,94 @@
+/*!
+Deck JS - deck.navigation
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+This module adds clickable previous and next links to the deck.
+*/
+(function($, undefined) {
+  var $document = $(document);
+
+  /* Updates link hrefs, and disabled states if last/first slide */
+  var updateButtons = function(event, from, to) {
+    var options = $.deck('getOptions');
+    var lastIndex = $.deck('getSlides').length - 1;
+    var $prevSlide = $.deck('getSlide', to - 1);
+    var $nextSlide = $.deck('getSlide', to + 1);
+    var hrefBase = window.location.href.replace(/#.*/, '');
+    var prevId = $prevSlide ? $prevSlide.attr('id') : undefined;
+    var nextId = $nextSlide ? $nextSlide.attr('id') : undefined;
+    var $prevButton = $(options.selectors.previousLink);
+    var $nextButton = $(options.selectors.nextLink);
+
+    $prevButton.toggleClass(options.classes.navDisabled, to === 0);
+    $prevButton.attr('aria-disabled', to === 0);
+    $prevButton.attr('href', hrefBase + '#' + (prevId ? prevId : ''));
+    $nextButton.toggleClass(options.classes.navDisabled, to === lastIndex);
+    $nextButton.attr('aria-disabled', to === lastIndex);
+    $nextButton.attr('href', hrefBase + '#' + (nextId ? nextId : ''));
+  };
+
+  /*
+  Extends defaults/options.
+
+  options.classes.navDisabled
+    This class is added to a navigation link when that action is disabled.
+    It is added to the previous link when on the first slide, and to the
+    next link when on the last slide.
+
+  options.selectors.nextLink
+    The elements that match this selector will move the deck to the next
+    slide when clicked.
+
+  options.selectors.previousLink
+    The elements that match this selector will move to deck to the previous
+    slide when clicked.
+  */
+  $.extend(true, $.deck.defaults, {
+    classes: {
+      navDisabled: 'deck-nav-disabled'
+    },
+
+    selectors: {
+      nextLink: '.deck-next-link',
+      previousLink: '.deck-prev-link'
+    }
+  });
+
+  $document.bind('deck.init', function() {
+    var options = $.deck('getOptions');
+    var slides = $.deck('getSlides');
+    var $current = $.deck('getSlide');
+    var $prevButton = $(options.selectors.previousLink);
+    var $nextButton = $(options.selectors.nextLink);
+    var index;
+
+    // Setup prev/next link events
+    $prevButton.unbind('click.decknavigation');
+    $prevButton.bind('click.decknavigation', function(event) {
+      $.deck('prev');
+      event.preventDefault();
+    });
+
+    $nextButton.unbind('click.decknavigation');
+    $nextButton.bind('click.decknavigation', function(event) {
+      $.deck('next');
+      event.preventDefault();
+    });
+
+    // Find where we started in the deck and set initial states
+    $.each(slides, function(i, $slide) {
+      if ($slide === $current) {
+        index = i;
+        return false;
+      }
+    });
+    updateButtons(null, index, index);
+  });
+
+  $document.bind('deck.change', updateButtons);
+})(jQuery);
+
diff --git a/Tom-Marble/deck.js/extensions/navigation/deck.navigation.scss b/Tom-Marble/deck.js/extensions/navigation/deck.navigation.scss
new file mode 100755 (executable)
index 0000000..6c39774
--- /dev/null
@@ -0,0 +1,44 @@
+.deck-prev-link, .deck-next-link {
+  display:none;
+  position:absolute;
+  z-index:3;
+  top:50%;
+  width:32px;
+  height:32px;
+  margin-top:-16px;
+  font-size:20px;
+  font-weight:bold;
+  line-height:32px;
+  vertical-align:middle;
+  text-align:center;
+  text-decoration:none;
+  color:#fff;
+  background:#888;
+  border-radius:16px;
+
+  &:hover, &:focus, &:active, &:visited {
+    color:#fff;
+  }
+}
+
+.deck-prev-link {
+  left:8px;
+}
+
+.deck-next-link {
+  right:8px;
+}
+
+.deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link {
+  display:block;
+
+  &.deck-nav-disabled, .touch & {
+    display:none;
+  }
+}
+
+@media print {
+  .deck-prev-link, .deck-next-link {
+    display:none !important;
+  }
+}
diff --git a/Tom-Marble/deck.js/extensions/onepage/deck.onepage.css b/Tom-Marble/deck.js/extensions/onepage/deck.onepage.css
new file mode 100644 (file)
index 0000000..0faf735
--- /dev/null
@@ -0,0 +1,39 @@
+.deck-onepage {
+  width: 100% !important;
+  height: auto !important;
+  padding: 0 !important;
+  display: block !important; }
+  .deck-onepage .slide {
+    position: static !important;
+    visibility: visible !important;
+    display: block !important;
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -o-transform: none !important;
+    -ms-transform: none !important;
+    transform: none !important;
+    opacity: 1 !important;
+    border-bottom: 1px dotted grey;
+    padding-bottom: 2em; }
+  .deck-onepage h1, .deck-onepage .vcenter {
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -o-transform: none !important;
+    -ms-transform: none !important;
+    transform: none !important;
+    padding: 0 !important;
+    position: static !important; }
+  .deck-onepage h1 {
+    text-align: center;
+    margin-top: 0 !important;
+    margin-bottom: 0; }
+  .deck-onepage form, .deck-onepage .deck-status, .deck-onepage .deck-permalink {
+    display: none; }
+  .deck-onepage pre {
+    padding: 1em 2em;
+    margin-left: 2em;
+    margin-right: 2em;
+    border-left: 2px solid grey; }
+  @media print {
+    .deck-onepage .deck-container > .slide {
+      page-break-after: auto; } }
diff --git a/Tom-Marble/deck.js/extensions/onepage/deck.onepage.js b/Tom-Marble/deck.js/extensions/onepage/deck.onepage.js
new file mode 100644 (file)
index 0000000..eff408c
--- /dev/null
@@ -0,0 +1,52 @@
+/*!
+  Deck JS - deck.onepage
+  Copyright (c) 2013 Rick Frankel
+  Dual licensed under the MIT license and GPL license.
+  https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+  https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt
+
+  This extension will toggle displaying the deck as a single
+  scrollable page when the 'o' (oh) key is pressed.
+
+  It does this by disabling the core stylesheet by setting the media
+  to 'not(screen,projection)' and adding and removing the
+  'deck-onepage' attribute to the deck container.
+*/
+
+(function($, deck, undefined) {
+    var $d        = $(document);
+    var $deck     = $[deck];
+    var $sheet    = $('link[href$="deck.core.css"]');
+    var $media    = $sheet.attr('media') || "";
+    var $options; // set in init below
+
+    $.extend(true, $deck.defaults, {
+        classes:  { onepage: 'deck-onepage' },
+        keys:     { onepage: 79 /* o */ }
+    });
+    $deck('extend', 'toggleOnePage', function() {
+        var wrapper  = $deck('getContainer');
+        var cls      = $options.classes.onepage;
+        var media    = 'not(screen,projection)';
+
+        if(wrapper.hasClass(cls)) {
+            wrapper.removeClass(cls);
+            media = $media;
+        } else wrapper.addClass(cls);
+
+        $sheet.attr('media', media);
+    });
+    $d.bind('deck.init', function() {
+        $options = $deck('getOptions');
+        /* Bind key events use keyup so modifier is included to avoid
+         * trapping ctrl-o (open).
+         */
+        $d.unbind('keyup.deckOnePage').bind(
+            'keyup.deckOnePage', function(e) {
+                if (!e.modifiers && e.which === $options.keys.onepage) {
+                    $deck('toggleOnePage');
+                    e.preventDefault();
+                }
+            });
+    });
+})(jQuery, 'deck');
diff --git a/Tom-Marble/deck.js/extensions/onepage/deck.onepage.scss b/Tom-Marble/deck.js/extensions/onepage/deck.onepage.scss
new file mode 100644 (file)
index 0000000..52a9376
--- /dev/null
@@ -0,0 +1,49 @@
+.deck-onepage {
+       width:100% !important;
+       height:auto !important;
+       padding:0 !important;
+       display:block !important;
+
+    .slide {
+           position:static !important;
+           visibility:visible !important;
+           display:block !important;
+           -webkit-transform:none !important;
+           -moz-transform:none !important;
+           -o-transform:none !important;
+           -ms-transform:none !important;
+           transform:none !important;
+           opacity:1 !important;
+
+           border-bottom: 1px dotted grey;
+           padding-bottom: 2em;
+    }
+    h1, .vcenter {
+           -webkit-transform:none !important;
+           -moz-transform:none !important;
+           -o-transform:none !important;
+           -ms-transform:none !important;
+           transform:none !important;
+           padding:0 !important;
+           position:static !important;
+    }
+    h1 {
+           text-align: center;
+           margin-top: 0 !important;
+        margin-bottom: 0;
+    }
+    form, .deck-status, .deck-permalink, .deck-toc-status {
+           display: none;
+    }
+    pre {
+           padding: 1em 2em;
+           margin-left: 2em;
+           margin-right: 2em;
+           border-left: 2px solid grey;
+    }
+    @media print {
+        .deck-container > .slide {
+            page-break-after: auto; // override one slide per page
+        }
+    }
+}
diff --git a/Tom-Marble/deck.js/extensions/scale/deck.scale.css b/Tom-Marble/deck.js/extensions/scale/deck.scale.css
new file mode 100644 (file)
index 0000000..785e403
--- /dev/null
@@ -0,0 +1,20 @@
+.csstransforms .deck-container.deck-scale:not(.deck-menu) {
+  overflow: hidden;
+}
+.csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide {
+  -moz-box-sizing: padding-box;
+  box-sizing: padding-box;
+  width: 100%;
+  padding-bottom: 20px;
+}
+.csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide > .deck-slide-scaler {
+  -webkit-transform-origin: 50% 0;
+  -ms-transform-origin: 50% 0;
+  transform-origin: 50% 0;
+}
+
+.csstransforms .deck-container.deck-menu .deck-slide-scaler {
+  -webkit-transform: none !important;
+  -ms-transform: none !important;
+  transform: none !important;
+}
diff --git a/Tom-Marble/deck.js/extensions/scale/deck.scale.js b/Tom-Marble/deck.js/extensions/scale/deck.scale.js
new file mode 100644 (file)
index 0000000..0e21631
--- /dev/null
@@ -0,0 +1,190 @@
+/*!
+Deck JS - deck.scale
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+This module adds automatic scaling to the deck.  Slides are scaled down
+using CSS transforms to fit within the deck container. If the container is
+big enough to hold the slides without scaling, no scaling occurs. The user
+can disable and enable scaling with a keyboard shortcut.
+
+Note: CSS transforms may make Flash videos render incorrectly.  Presenters
+that need to use video may want to disable scaling to play them.  HTML5 video
+works fine.
+*/
+(function($, undefined) {
+  var $document = $(document);
+  var $window = $(window);
+  var baseHeight, timer, rootSlides;
+
+  /*
+  Internal function to do all the dirty work of scaling the slides.
+  */
+  var scaleDeck = function() {
+    var options = $.deck('getOptions');
+    var $container = $.deck('getContainer');
+    var baseHeight = options.baseHeight;
+
+    if (!baseHeight) {
+      baseHeight = $container.height();
+    }
+
+    // Scale each slide down if necessary (but don't scale up)
+    $.each(rootSlides, function(i, $slide) {
+      var slideHeight = $slide.innerHeight();
+      var $scaler = $slide.find('.' + options.classes.scaleSlideWrapper);
+      var shouldScale = $container.hasClass(options.classes.scale);
+      var scale = shouldScale ? baseHeight / slideHeight : 1;
+
+      if (scale === 1) {
+        $scaler.css('transform', '');
+      }
+      else {
+        $scaler.css('transform', 'scale(' + scale + ')');
+        window.setTimeout(function() {
+          $container.scrollTop(0)
+        }, 1);
+      }
+    });
+  };
+
+  var populateRootSlides = function() {
+    var options = $.deck('getOptions');
+    var slideTest = $.map([
+      options.classes.before,
+      options.classes.previous,
+      options.classes.current,
+      options.classes.next,
+      options.classes.after
+    ], function(el, i) {
+      return '.' + el;
+    }).join(', ');
+
+    rootSlides = [];
+    $.each($.deck('getSlides'), function(i, $slide) {
+      var $parentSlides = $slide.parentsUntil(
+        options.selectors.container,
+        slideTest
+      );
+      if (!$parentSlides.length) {
+        rootSlides.push($slide);
+      }
+    });
+  };
+
+  var wrapRootSlideContent = function() {
+    var options = $.deck('getOptions');
+    var wrap = '<div class="' + options.classes.scaleSlideWrapper + '"/>';
+    $.each(rootSlides, function(i, $slide) {
+      $slide.children().wrapAll(wrap);
+    });
+  };
+
+  var scaleOnResizeAndLoad = function() {
+    var options = $.deck('getOptions');
+
+    $window.unbind('resize.deckscale');
+    $window.bind('resize.deckscale', function() {
+      window.clearTimeout(timer);
+      timer = window.setTimeout(scaleDeck, options.scaleDebounce);
+    });
+    $.deck('enableScale');
+    $window.unbind('load.deckscale');
+    $window.bind('load.deckscale', scaleDeck);
+  };
+
+  var bindKeyEvents = function() {
+    var options = $.deck('getOptions');
+    $document.unbind('keydown.deckscale');
+    $document.bind('keydown.deckscale', function(event) {
+      var isKey = event.which === options.keys.scale;
+      isKey = isKey || $.inArray(event.which, options.keys.scale) > -1;
+      if (isKey) {
+        $.deck('toggleScale');
+        event.preventDefault();
+      }
+    });
+  };
+
+  /*
+  Extends defaults/options.
+
+  options.classes.scale
+    This class is added to the deck container when scaling is enabled.
+    It is enabled by default when the module is included.
+
+  options.classes.scaleSlideWrapper
+    Scaling is done using a wrapper around the contents of each slide. This
+    class is applied to that wrapper.
+
+  options.keys.scale
+    The numeric keycode used to toggle enabling and disabling scaling.
+
+  options.baseHeight
+    When baseHeight is falsy, as it is by default, the deck is scaled in
+    proportion to the height of the deck container. You may instead specify
+    a height as a number of px, and slides will be scaled against this
+    height regardless of the container size.
+
+  options.scaleDebounce
+    Scaling on the browser resize event is debounced. This number is the
+    threshold in milliseconds. You can learn more about debouncing here:
+    http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
+
+  */
+  $.extend(true, $.deck.defaults, {
+    classes: {
+      scale: 'deck-scale',
+      scaleSlideWrapper: 'deck-slide-scaler'
+    },
+
+    keys: {
+      scale: 83 // s
+    },
+
+    baseHeight: null,
+    scaleDebounce: 200
+  });
+
+  /*
+  jQuery.deck('disableScale')
+
+  Disables scaling and removes the scale class from the deck container.
+  */
+  $.deck('extend', 'disableScale', function() {
+    $.deck('getContainer').removeClass($.deck('getOptions').classes.scale);
+    scaleDeck();
+  });
+
+  /*
+  jQuery.deck('enableScale')
+
+  Enables scaling and adds the scale class to the deck container.
+  */
+  $.deck('extend', 'enableScale', function() {
+    $.deck('getContainer').addClass($.deck('getOptions').classes.scale);
+    scaleDeck();
+  });
+
+  /*
+  jQuery.deck('toggleScale')
+
+  Toggles between enabling and disabling scaling.
+  */
+  $.deck('extend', 'toggleScale', function() {
+    var $container = $.deck('getContainer');
+    var isScaled = $container.hasClass($.deck('getOptions').classes.scale);
+    $.deck(isScaled? 'disableScale' : 'enableScale');
+  });
+
+  $document.bind('deck.init', function() {
+    populateRootSlides();
+    wrapRootSlideContent();
+    scaleOnResizeAndLoad();
+    bindKeyEvents();
+  });
+})(jQuery, 'deck', this);
+
diff --git a/Tom-Marble/deck.js/extensions/scale/deck.scale.scss b/Tom-Marble/deck.js/extensions/scale/deck.scale.scss
new file mode 100644 (file)
index 0000000..8909357
--- /dev/null
@@ -0,0 +1,22 @@
+.csstransforms .deck-container.deck-scale:not(.deck-menu) {
+  overflow:hidden;
+
+  > .slide {
+    -moz-box-sizing: padding-box;
+    box-sizing: padding-box;
+    width:100%;
+    padding-bottom:20px;
+
+    > .deck-slide-scaler {
+      -webkit-transform-origin: 50% 0;
+      -ms-transform-origin: 50% 0;
+      transform-origin: 50% 0;
+    }
+  }
+}
+
+.csstransforms .deck-container.deck-menu .deck-slide-scaler {
+  -webkit-transform:none !important;
+  -ms-transform:none !important;
+  transform:none !important;
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/extensions/status/deck.status.css b/Tom-Marble/deck.js/extensions/status/deck.status.css
new file mode 100644 (file)
index 0000000..b273646
--- /dev/null
@@ -0,0 +1,18 @@
+.deck-status {
+  position: absolute;
+  bottom: 10px;
+  right: 5px;
+  color: #888;
+  z-index: 3;
+  margin: 0;
+}
+
+body > .deck-container .deck-status {
+  position: fixed;
+}
+
+@media print {
+  .deck-status {
+    display: none;
+  }
+}
diff --git a/Tom-Marble/deck.js/extensions/status/deck.status.html b/Tom-Marble/deck.js/extensions/status/deck.status.html
new file mode 100644 (file)
index 0000000..5ecea5e
--- /dev/null
@@ -0,0 +1,6 @@
+<!-- Place the following snippet at the bottom of the deck container. -->
+<p class="deck-status" aria-role="status">
+  <span class="deck-status-current"></span>
+  /
+  <span class="deck-status-total"></span>
+</p>
diff --git a/Tom-Marble/deck.js/extensions/status/deck.status.js b/Tom-Marble/deck.js/extensions/status/deck.status.js
new file mode 100644 (file)
index 0000000..dca0734
--- /dev/null
@@ -0,0 +1,108 @@
+/*!
+Deck JS - deck.status
+Copyright (c) 2011-2014 Caleb Troughton
+Dual licensed under the MIT license.
+https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt
+*/
+
+/*
+This module adds a (current)/(total) style status indicator to the deck.
+*/
+(function($, undefined) {
+  var $document = $(document);
+  var rootCounter;
+
+  var updateCurrent = function(event, from, to) {
+    var options = $.deck('getOptions');
+    var currentSlideNumber = to + 1;
+    if (!options.countNested) {
+      currentSlideNumber = $.deck('getSlide', to).data('rootSlide');
+    }
+    $(options.selectors.statusCurrent).text(currentSlideNumber);
+  };
+
+  var markRootSlides = function() {
+    var options = $.deck('getOptions');
+    var slideTest = $.map([
+      options.classes.before,
+      options.classes.previous,
+      options.classes.current,
+      options.classes.next,
+      options.classes.after
+    ], function(el, i) {
+      return '.' + el;
+    }).join(', ');
+
+    rootCounter = 0;
+    $.each($.deck('getSlides'), function(i, $slide) {
+      var $parentSlides = $slide.parentsUntil(
+        options.selectors.container,
+        slideTest
+      );
+
+      if ($parentSlides.length) {
+        $slide.data('rootSlide', $parentSlides.last().data('rootSlide'));
+      }
+      else {
+        ++rootCounter;
+        $slide.data('rootSlide', rootCounter);
+      }
+    });
+  };
+
+  var setInitialSlideNumber = function() {
+    var slides = $.deck('getSlides');
+    var $currentSlide = $.deck('getSlide');
+    var index;
+
+    $.each(slides, function(i, $slide) {
+      if ($slide === $currentSlide) {
+        index = i;
+        return false;
+      }
+    });
+    updateCurrent(null, index, index);
+  };
+
+  var setTotalSlideNumber = function() {
+    var options = $.deck('getOptions');
+    var slides = $.deck('getSlides');
+
+    if (options.countNested) {
+      $(options.selectors.statusTotal).text(slides.length);
+    }
+    else {
+      $(options.selectors.statusTotal).text(rootCounter);
+    }
+  };
+
+  /*
+  Extends defaults/options.
+
+  options.selectors.statusCurrent
+    The element matching this selector displays the current slide number.
+
+  options.selectors.statusTotal
+    The element matching this selector displays the total number of slides.
+
+  options.countNested
+    If false, only top level slides will be counted in the current and
+    total numbers.
+  */
+  $.extend(true, $.deck.defaults, {
+    selectors: {
+      statusCurrent: '.deck-status-current',
+      statusTotal: '.deck-status-total'
+    },
+
+    countNested: true
+  });
+
+  $document.bind('deck.init', function() {
+    markRootSlides();
+    setInitialSlideNumber();
+    setTotalSlideNumber();
+  });
+  $document.bind('deck.change', updateCurrent);
+})(jQuery, 'deck');
+
diff --git a/Tom-Marble/deck.js/extensions/status/deck.status.scss b/Tom-Marble/deck.js/extensions/status/deck.status.scss
new file mode 100755 (executable)
index 0000000..d0722bf
--- /dev/null
@@ -0,0 +1,18 @@
+.deck-status {
+  position:absolute;
+  bottom:10px;
+  right:5px;
+  color:#888;
+  z-index:3;
+  margin:0;
+}
+
+body > .deck-container .deck-status {
+  position:fixed;
+}
+
+@media print {
+  .deck-status {
+    display:none;
+  }
+}
diff --git a/Tom-Marble/deck.js/introduction/index.html b/Tom-Marble/deck.js/introduction/index.html
new file mode 100644 (file)
index 0000000..2e930eb
--- /dev/null
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]> <html class="no-js ie6" lang="en"> <![endif]-->
+<!--[if IE 7]>    <html class="no-js ie7" lang="en"> <![endif]-->
+<!--[if IE 8]>    <html class="no-js ie8" lang="en"> <![endif]-->
+<!--[if gt IE 8]><!-->  <html class="no-js" lang="en"> <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+
+  <title>Getting Started with deck.js</title>
+
+  <meta name="description" content="A jQuery library for modern HTML presentations">
+  <meta name="author" content="Caleb Troughton">
+  <meta name="viewport" content="width=1024, user-scalable=no">
+
+  <!-- Core and extension CSS files -->
+  <link rel="stylesheet" media="screen" href="../core/deck.core.css">
+  <link rel="stylesheet" media="screen" href="../extensions/goto/deck.goto.css">
+  <link rel="stylesheet" media="screen" href="../extensions/menu/deck.menu.css">
+  <link rel="stylesheet" media="screen" href="../extensions/navigation/deck.navigation.css">
+  <link rel="stylesheet" media="screen" href="../extensions/status/deck.status.css">
+  <link rel="stylesheet" media="screen" href="../extensions/scale/deck.scale.css">
+
+  <!-- Style theme. More available in /themes/style/ or create your own. -->
+  <link rel="stylesheet" media="screen" href="../themes/style/web-2.0.css">
+
+  <!-- Transition theme. More available in /themes/transition/ or create your own. -->
+  <link rel="stylesheet" media="screen" href="../themes/transition/horizontal-slide.css">
+
+  <!-- Basic black and white print styles -->
+  <link rel="stylesheet" media="print" href="../core/print.css">
+
+  <script src="../modernizr.custom.js"></script>
+</head>
+
+<body>
+  <div class="deck-container">
+
+    <!-- Begin slides -->
+    <section class="slide" id="title-slide">
+      <h1>Getting Started with deck.js</h1>
+    </section>
+
+    <section class="slide" id="how-to-overview">
+      <h2>How to Make a Deck</h2>
+      <ol>
+        <li>
+          <h3>Write Slides</h3>
+          <p>Slide content is simple&nbsp;HTML.</p>
+        </li>
+        <li>
+          <h3>Choose Themes</h3>
+          <p>One for slide styles and one for deck&nbsp;transitions.</p>
+        </li>
+        <li>
+          <h3>Include Extensions</h3>
+          <p>Add extra functionality to your deck, or leave it stripped&nbsp;down.</p>
+        </li>
+      </ol>
+    </section>
+
+    <section class="slide" id="quick-start">
+      <h2>Quick Start</h2>
+      <p>When you <a href="https://github.com/imakewebthings/deck.js/archive/latest.zip">download</a> deck.js, it will include a file named <code>boilerplate.html</code>. You can immediately start editing slides in this page and viewing them in your web browser. Later on, when you are comfortable customizing the deck, you can edit the various pieces of the boilerplate or make your own to suit your needs.</p>
+    </section>
+
+    <section class="slide" id="markup">
+      <h2>The Markup</h2>
+      <p>Slides are just HTML elements with a class of <code>slide</code>.</p>
+      <pre><code>&lt;section class=&quot;slide&quot;&gt;
+  &lt;h2&gt;How to Make a Deck&lt;/h2&gt;
+  &lt;ol&gt;
+    &lt;li&gt;
+      &lt;h3&gt;Write Slides&lt;/h3&gt;
+      &lt;p&gt;Slide content is simple HTML.&lt;/p&gt;
+    &lt;/li&gt;
+    &lt;li&gt;
+      &lt;h3&gt;Choose Themes&lt;/h3&gt;
+      &lt;p&gt;One for slide styles and one for deck transitions.&lt;/p&gt;
+    &lt;/li&gt;
+    &hellip;
+  &lt;/ol&gt;
+&lt;/section&gt;</code></pre>
+    </section>
+
+    <section class="slide" id="themes">
+      <h2>Style Themes</h2>
+      <p>Customizes the colors, typography, and layout of slide&nbsp;content.</p>
+      <pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;/path/to/css/style-theme.css&quot;&gt;</code></pre>
+      <h2>Transition Themes</h2>
+      <p>Defines transitions between slides using CSS3 transitions.  Less capable browsers fall back to cutaways. But <strong>you</strong> aren&rsquo;t using <em>those</em> browsers to give your presentations, are&nbsp;you&hellip;</p>
+      <pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;/path/to/css/transition-theme.css&quot;&gt;</code></pre>
+    </section>
+
+    <section class="slide" id="extensions">
+      <h2>Extensions</h2>
+      <p>Core gives you basic slide functionality with left and right arrow navigation, but you may want more. Here are the ones included in this&nbsp;deck:</p>
+
+      <ul>
+        <li class="slide" id="extensions-goto">
+          <strong>deck.goto</strong>: Adds a shortcut key to jump to any slide number.  Hit g, type in the slide number, and hit&nbsp;enter.
+        </li>
+
+        <li class="slide" id="extensions-menu">
+          <strong>deck.menu</strong>: Adds a menu view, letting you see all slides in a grid. Hit m to toggle to menu view, continue navigating your deck, and hit m to return to normal view. Touch devices can double-tap the deck to switch between&nbsp;views.
+        </li>
+
+        <li class="slide" id="extensions-navigation">
+          <strong>deck.navigation</strong>: Adds clickable left and right buttons for the less keyboard&nbsp;inclined.
+        </li>
+
+        <li class="slide" id="extensions-status">
+          <strong>deck.status</strong>: Adds a page number indicator. (current/total)
+        </li>
+
+        <li class="slide" id="extensions-scale">
+          <strong>deck.scale</strong>: Scales each slide to fit within the deck container using CSS Transforms for those browsers that support them.
+        </li>
+      </ul>
+
+      <p class="slide" id="extension-folders">Each extension folder in the download package contains the necessary JavaScript, CSS, and HTML&nbsp;files. For a complete list of extension modules included in deck.js, check out the&nbsp;<a href="http://imakewebthings.com/deck.js/docs">documentation</a>.</p>
+    </section>
+
+    <section class="slide" id="nested">
+      <h2>Nested Slides</h2>
+      <p>That last slide had a few steps.  To create substeps in slides, just nest them:</p>
+      <pre><code>&lt;section class=&quot;slide&quot;&gt;
+  &lt;h2&gt;Extensions&lt;/h2&gt;
+  &lt;p&gt;Core gives you basic slide functionality...&lt;/p&gt;
+  &lt;ul&gt;
+    &lt;li class=&quot;slide&quot;&gt;
+      &lt;h3&gt;deck.goto&lt;/h3&gt;
+      &lt;p&gt;Adds a shortcut key to jump to any slide number...&lt;/p&gt;
+    &lt;/li&gt;
+    &lt;li class=&quot;slide&quot;&gt;...&lt;/li&gt;
+    &lt;li class=&quot;slide&quot;&gt;...&lt;/li&gt;
+    &lt;li class=&quot;slide&quot;&gt;...&lt;/li&gt;
+  &lt;/ul&gt;
+&lt;/section&gt;</code></pre>
+    </section>
+
+    <section class="slide" id="elements-images">
+      <h2>Other Elements: Images</h2>
+      <img src="http://placekitten.com/600/375" alt="Kitties">
+      <pre><code>&lt;img src=&quot;http://placekitten.com/600/375&quot; alt=&quot;Kitties&quot;&gt;</code></pre>
+    </section>
+
+    <section class="slide" id="elements-blockquotes">
+      <h2>Other Elements: Blockquotes</h2>
+      <blockquote cite="http://example.org">
+        <p>Food is an important part of a balanced diet.</p>
+        <p><cite>Fran Lebowitz</cite></p>
+      </blockquote>
+      <pre><code>&lt;blockquote cite=&quot;http://example.org&quot;&gt;
+  &lt;p&gt;Food is an important part of a balanced diet.&lt;/p&gt;
+  &lt;p&gt;&lt;cite&gt;Fran Lebowitz&lt;/cite&gt;&lt;/p&gt;
+&lt;/blockquote&gt;</code></pre>
+    </section>
+
+
+    <section class="slide" id="elements-videos">
+      <h2>Other Elements: Video Embeds</h2>
+      <p>Embed videos from your favorite online video service or with an HTML5 video&nbsp;element.</p>
+
+      <iframe src="http://player.vimeo.com/video/1063136?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0"></iframe>
+
+      <pre><code>&lt;iframe src=&quot;http://player.vimeo.com/video/1063136?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;400&quot; height=&quot;225&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;</code></pre>
+    </section>
+
+    <section class="slide" id="digging-deeper">
+      <h2>Digging Deeper</h2>
+      <p>If you want to learn about making your own themes, extending deck.js, and more, check out the&nbsp;<a href="../docs/">documentation</a>.</p>
+    </section>
+
+    <!-- deck.navigation snippet -->
+    <div aria-role="navigation">
+      <a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
+      <a href="#" class="deck-next-link" title="Next">&#8594;</a>
+    </div>
+
+    <!-- deck.status snippet -->
+    <p class="deck-status" aria-role="status">
+      <span class="deck-status-current"></span>
+      /
+      <span class="deck-status-total"></span>
+    </p>
+
+    <!-- deck.goto snippet -->
+    <form action="." method="get" class="goto-form">
+      <label for="goto-slide">Go to slide:</label>
+      <input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
+      <datalist id="goto-datalist"></datalist>
+      <input type="submit" value="Go">
+    </form>
+  </div>
+
+<script src="../jquery.min.js"></script>
+
+<!-- Deck Core and extensions -->
+<script src="../core/deck.core.js"></script>
+<script src="../extensions/menu/deck.menu.js"></script>
+<script src="../extensions/goto/deck.goto.js"></script>
+<script src="../extensions/status/deck.status.js"></script>
+<script src="../extensions/navigation/deck.navigation.js"></script>
+<script src="../extensions/scale/deck.scale.js"></script>
+
+<!-- Initialize the deck -->
+<script>
+$(function() {
+  $.deck('.slide');
+});
+</script>
+
+</body>
+</html>
diff --git a/Tom-Marble/deck.js/jquery.min.js b/Tom-Marble/deck.js/jquery.min.js
new file mode 100644 (file)
index 0000000..76d21a4
--- /dev/null
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/modernizr.custom.js b/Tom-Marble/deck.js/modernizr.custom.js
new file mode 100644 (file)
index 0000000..964fb40
--- /dev/null
@@ -0,0 +1,4 @@
+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD
+ * Contains: fontface | backgroundsize | borderimage | borderradius | boxshadow | flexbox | hsla | multiplebgs | opacity | rgba | textshadow | cssanimations | csscolumns | generatedcontent | cssgradients | cssreflections | csstransforms | csstransforms3d | csstransitions | applicationcache | canvas | canvastext | draganddrop | hashchange | history | audio | video | indexeddb | input | inputtypes | localstorage | postmessage | sessionstorage | websockets | websqldatabase | webworkers | geolocation | inlinesvg | smil | svg | svgclippaths | touch | webgl | iepp | cssclasses | addtest | teststyles | testprop | testallprops | hasevent | prefixes | domprefixes | load
+ */
+;window.Modernizr=function(a,b,c){function H(){e.input=function(a){for(var b=0,c=a.length;b<c;b++)t[a[b]]=a[b]in l;return t}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)l.setAttribute("type",f=a[d]),e=l.type!=="text",e&&(l.value=m,l.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&l.style.WebkitAppearance!==c?(g.appendChild(l),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(l,null).WebkitAppearance!=="textfield"&&l.offsetHeight!==0,g.removeChild(l)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=l.checkValidity&&l.checkValidity()===!1:/^color$/.test(f)?(g.appendChild(l),g.offsetWidth,e=l.value!=m,g.removeChild(l)):e=l.value!=m)),s[a[d]]=!!e;return s}("search tel url email datetime date month week time datetime-local number range color".split(" "))}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function D(a,b){return!!~(""+a).indexOf(b)}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["&shy;","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),x,y={}.hasOwnProperty,z;!C(y,c)&&!C(y.call,c)?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)};var G=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b].toLowerCase()+"IndexedDB"])return!0;return!!a.indexedDB},r.hashchange=function(){return w("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return w("dragstart")&&w("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b]+"WebSocket"])return!0;return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(https://),url(https://),red url(https://)");return/(url\s*\(.*?){3}/.test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius")},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d);return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){return e.fontface},r.generatedcontent=function(){return e.generatedcontent},r.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}}catch(e){}return c},r.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")}catch(d){}return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webworkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="<svg/>";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var I in r)z(r,I)&&(x=I.toLowerCase(),e[x]=r[I](),u.push((e[x]?"":"no-")+x));e.input||H(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)z(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return;b=typeof b=="boolean"?b:!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b}return e},A(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,e._prefixes=o,e._domPrefixes=p,e.hasEvent=w,e.testProp=function(a){return E([a])},e.testAllProps=F,e.testStyles=v,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+u.join(" "):"");return e}(this,this.document),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/test/fixtures/empty.html b/Tom-Marble/deck.js/test/fixtures/empty.html
new file mode 100644 (file)
index 0000000..cdadd2a
--- /dev/null
@@ -0,0 +1,21 @@
+<div class="deck-container">
+  <div aria-role="navigation">
+    <a href="#" class="deck-prev-link">Previous</a>
+    <a href="#" class="deck-next-link">Next</a>
+  </div>
+
+  <p class="deck-status" aria-role="status">
+    <span class="deck-status-current"></span>
+    /
+    <span class="deck-status-total"></span>
+  </p>
+
+  <form action="." method="get" class="goto-form">
+    <label for="goto-slide">Go to slide:</label>
+    <input type="number" name="slidenum" id="goto-slide" value="">
+    <input type="submit" value="Go">
+  </form>
+
+  <a href="#" class="deck-permalink">#</a>
+  <a href="#custom-id" id="internal-test">Internal Test Link</a>
+</div>
diff --git a/Tom-Marble/deck.js/test/fixtures/nesteds.html b/Tom-Marble/deck.js/test/fixtures/nesteds.html
new file mode 100644 (file)
index 0000000..c3fb7c3
--- /dev/null
@@ -0,0 +1,36 @@
+<div class="deck-container">
+  <div class="slide toplevel">
+  </div>
+
+  <div class="slide toplevel">
+  </div>
+
+  <div class="slide root toplevel">
+    <div class="slide"></div>
+    <div class="slide"></div>
+    <div class="slide"></div>
+    <div class="slide">
+        <div class="slide"></div>
+        <div class="slide"></div>
+        <div class="slide"></div>
+    </div>
+  </div>
+
+  <div class="slide toplevel" id="after">
+  </div>
+
+  <div class="slide toplevel">
+  </div>
+
+  <p class="deck-status" aria-role="status">
+    <span class="deck-status-current"></span>
+    /
+    <span class="deck-status-total"></span>
+  </p>
+
+  <form action="." method="get" class="goto-form">
+    <label for="goto-slide">Go to slide:</label>
+    <input type="number" name="slidenum" id="goto-slide" value="">
+    <input type="submit" value="Go">
+  </form>
+</div>
diff --git a/Tom-Marble/deck.js/test/fixtures/standard.html b/Tom-Marble/deck.js/test/fixtures/standard.html
new file mode 100644 (file)
index 0000000..328ee7d
--- /dev/null
@@ -0,0 +1,44 @@
+<div class="deck-container">
+  <div class="slide slide1"></div>
+
+  <div class="slide slide2" id="custom-id"></div>
+
+  <div class="slide slide3"></div>
+
+  <div class="slide slide4"></div>
+
+  <div class="slide slide5"></div>
+
+  <div aria-role="navigation">
+    <a href="#" class="deck-prev-link">Previous</a>
+    <a href="#" class="deck-next-link">Next</a>
+  </div>
+
+  <p class="deck-status" aria-role="status">
+    <span class="deck-status-current"></span>
+    /
+    <span class="deck-status-total"></span>
+  </p>
+
+  <form action="." method="get" class="goto-form">
+    <label for="goto-slide">Go to slide:</label>
+    <input type="number" name="slidenum" id="goto-slide" value="" list="goto-datalist">
+    <datalist id="goto-datalist"></datalist>
+    <input type="submit" value="Go">
+  </form>
+
+  <a href="#" class="deck-permalink">#</a>
+  <a href="#custom-id" id="internal-test">Internal Test Link</a>
+</div>
+
+<div class="alt-container">
+  <div class="alt-slide alt-slide1"><input></div>
+
+  <div class="alt-slide alt-slide2"></div>
+
+  <div class="alt-slide alt-slide3"></div>
+
+  <div class="alt-slide alt-slide4"></div>
+
+  <div class="alt-slide alt-slide5"></div>
+</div>
diff --git a/Tom-Marble/deck.js/test/index.html b/Tom-Marble/deck.js/test/index.html
new file mode 100644 (file)
index 0000000..f8454e8
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <title>deck.js - Jasmine Test Runner</title>
+  <link rel="stylesheet" type="text/css" href="lib/jasmine.css">
+  <script type="text/javascript" src="../modernizr.custom.js"></script>
+  <script type="text/javascript" src="lib/jasmine.js"></script>
+  <script type="text/javascript" src="lib/jasmine-html.js"></script>
+  <script src="../jquery.min.js"></script>
+  <script type="text/javascript" src="lib/jasmine-jquery.js"></script>
+
+  <!-- include source files here... -->
+  <script type="text/javascript" src="../core/deck.core.js"></script>
+  <script type="text/javascript" src="../extensions/menu/deck.menu.js"></script>
+  <script type="text/javascript" src="../extensions/goto/deck.goto.js"></script>
+  <script type="text/javascript" src="../extensions/status/deck.status.js"></script>
+  <script type="text/javascript" src="../extensions/navigation/deck.navigation.js"></script>
+  <script type="text/javascript" src="../extensions/scale/deck.scale.js"></script>
+
+  <!-- include spec files here... -->
+  <script type="text/javascript" src="settings.js"></script>
+  <script type="text/javascript" src="spec.core.js"></script>
+  <script type="text/javascript" src="spec.menu.js"></script>
+  <script type="text/javascript" src="spec.goto.js"></script>
+  <script type="text/javascript" src="spec.navigation.js"></script>
+  <script type="text/javascript" src="spec.status.js"></script>
+  <script type="text/javascript" src="spec.scale.js"></script>
+</head>
+
+<body>
+<script type="text/javascript">
+  jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
+  jasmine.getEnv().execute();
+</script>
+</body>
+</html>
diff --git a/Tom-Marble/deck.js/test/lib/jasmine-html.js b/Tom-Marble/deck.js/test/lib/jasmine-html.js
new file mode 100755 (executable)
index 0000000..7383401
--- /dev/null
@@ -0,0 +1,190 @@
+jasmine.TrivialReporter = function(doc) {
+  this.document = doc || document;
+  this.suiteDivs = {};
+  this.logRunningSpecs = false;
+};
+
+jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
+  var el = document.createElement(type);
+
+  for (var i = 2; i < arguments.length; i++) {
+    var child = arguments[i];
+
+    if (typeof child === 'string') {
+      el.appendChild(document.createTextNode(child));
+    } else {
+      if (child) { el.appendChild(child); }
+    }
+  }
+
+  for (var attr in attrs) {
+    if (attr == "className") {
+      el[attr] = attrs[attr];
+    } else {
+      el.setAttribute(attr, attrs[attr]);
+    }
+  }
+
+  return el;
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
+  var showPassed, showSkipped;
+
+  this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
+      this.createDom('div', { className: 'banner' },
+        this.createDom('div', { className: 'logo' },
+            this.createDom('span', { className: 'title' }, "Jasmine"),
+            this.createDom('span', { className: 'version' }, runner.env.versionString())),
+        this.createDom('div', { className: 'options' },
+            "Show ",
+            showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
+            this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
+            showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
+            this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
+            )
+          ),
+
+      this.runnerDiv = this.createDom('div', { className: 'runner running' },
+          this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
+          this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
+          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
+      );
+
+  this.document.body.appendChild(this.outerDiv);
+
+  var suites = runner.suites();
+  for (var i = 0; i < suites.length; i++) {
+    var suite = suites[i];
+    var suiteDiv = this.createDom('div', { className: 'suite' },
+        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
+        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
+    this.suiteDivs[suite.id] = suiteDiv;
+    var parentDiv = this.outerDiv;
+    if (suite.parentSuite) {
+      parentDiv = this.suiteDivs[suite.parentSuite.id];
+    }
+    parentDiv.appendChild(suiteDiv);
+  }
+
+  this.startedAt = new Date();
+
+  var self = this;
+  showPassed.onclick = function(evt) {
+    if (showPassed.checked) {
+      self.outerDiv.className += ' show-passed';
+    } else {
+      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
+    }
+  };
+
+  showSkipped.onclick = function(evt) {
+    if (showSkipped.checked) {
+      self.outerDiv.className += ' show-skipped';
+    } else {
+      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
+    }
+  };
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
+  var results = runner.results();
+  var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
+  this.runnerDiv.setAttribute("class", className);
+  //do it twice for IE
+  this.runnerDiv.setAttribute("className", className);
+  var specs = runner.specs();
+  var specCount = 0;
+  for (var i = 0; i < specs.length; i++) {
+    if (this.specFilter(specs[i])) {
+      specCount++;
+    }
+  }
+  var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
+  message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
+  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
+
+  this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
+};
+
+jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
+  var results = suite.results();
+  var status = results.passed() ? 'passed' : 'failed';
+  if (results.totalCount === 0) { // todo: change this to check results.skipped
+    status = 'skipped';
+  }
+  this.suiteDivs[suite.id].className += " " + status;
+};
+
+jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
+  if (this.logRunningSpecs) {
+    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
+  }
+};
+
+jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
+  var results = spec.results();
+  var status = results.passed() ? 'passed' : 'failed';
+  if (results.skipped) {
+    status = 'skipped';
+  }
+  var specDiv = this.createDom('div', { className: 'spec '  + status },
+      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
+      this.createDom('a', {
+        className: 'description',
+        href: '?spec=' + encodeURIComponent(spec.getFullName()),
+        title: spec.getFullName()
+      }, spec.description));
+
+
+  var resultItems = results.getItems();
+  var messagesDiv = this.createDom('div', { className: 'messages' });
+  for (var i = 0; i < resultItems.length; i++) {
+    var result = resultItems[i];
+
+    if (result.type == 'log') {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
+    } else if (result.type == 'expect' && result.passed && !result.passed()) {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
+
+      if (result.trace.stack) {
+        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
+      }
+    }
+  }
+
+  if (messagesDiv.childNodes.length > 0) {
+    specDiv.appendChild(messagesDiv);
+  }
+
+  this.suiteDivs[spec.suite.id].appendChild(specDiv);
+};
+
+jasmine.TrivialReporter.prototype.log = function() {
+  var console = jasmine.getGlobal().console;
+  if (console && console.log) {
+    if (console.log.apply) {
+      console.log.apply(console, arguments);
+    } else {
+      console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
+    }
+  }
+};
+
+jasmine.TrivialReporter.prototype.getLocation = function() {
+  return this.document.location;
+};
+
+jasmine.TrivialReporter.prototype.specFilter = function(spec) {
+  var paramMap = {};
+  var params = this.getLocation().search.substring(1).split('&');
+  for (var i = 0; i < params.length; i++) {
+    var p = params[i].split('=');
+    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
+  }
+
+  if (!paramMap.spec) {
+    return true;
+  }
+  return spec.getFullName().indexOf(paramMap.spec) === 0;
+};
diff --git a/Tom-Marble/deck.js/test/lib/jasmine-jquery.js b/Tom-Marble/deck.js/test/lib/jasmine-jquery.js
new file mode 100755 (executable)
index 0000000..4f7357d
--- /dev/null
@@ -0,0 +1,288 @@
+var readFixtures = function() {
+  return jasmine.getFixtures().proxyCallTo_('read', arguments);
+};
+
+var preloadFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('preload', arguments);
+};
+
+var loadFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('load', arguments);
+};
+
+var setFixtures = function(html) {
+  jasmine.getFixtures().set(html);
+};
+
+var sandbox = function(attributes) {
+  return jasmine.getFixtures().sandbox(attributes);
+};
+
+var spyOnEvent = function(selector, eventName) {
+  jasmine.JQuery.events.spyOn(selector, eventName);
+}
+
+jasmine.getFixtures = function() {
+  return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
+};
+
+jasmine.Fixtures = function() {
+  this.containerId = 'jasmine-fixtures';
+  this.fixturesCache_ = {};
+  this.fixturesPath = 'spec/javascripts/fixtures';
+};
+
+jasmine.Fixtures.prototype.set = function(html) {
+  this.cleanUp();
+  this.createContainer_(html);
+};
+
+jasmine.Fixtures.prototype.preload = function() {
+  this.read.apply(this, arguments);
+};
+
+jasmine.Fixtures.prototype.load = function() {
+  this.cleanUp();
+  this.createContainer_(this.read.apply(this, arguments));
+};
+
+jasmine.Fixtures.prototype.read = function() {
+  var htmlChunks = [];
+
+  var fixtureUrls = arguments;
+  for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
+    htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
+  }
+
+  return htmlChunks.join('');
+};
+
+jasmine.Fixtures.prototype.clearCache = function() {
+  this.fixturesCache_ = {};
+};
+
+jasmine.Fixtures.prototype.cleanUp = function() {
+  jQuery('#' + this.containerId).remove();
+};
+
+jasmine.Fixtures.prototype.sandbox = function(attributes) {
+  var attributesToSet = attributes || {};
+  return jQuery('<div id="sandbox" />').attr(attributesToSet);
+};
+
+jasmine.Fixtures.prototype.createContainer_ = function(html) {
+  var container;
+  if(html instanceof jQuery) {
+    container = jQuery('<div id="' + this.containerId + '" />');
+    container.html(html);
+  } else {
+    container = '<div id="' + this.containerId + '">' + html + '</div>'
+  }
+  jQuery('body').append(container);
+};
+
+jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {  
+  if (typeof this.fixturesCache_[url] == 'undefined') {
+    this.loadFixtureIntoCache_(url);
+  }
+  return this.fixturesCache_[url];
+};
+
+jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
+  var self = this;
+  var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl;
+  jQuery.ajax({
+    async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
+    cache: false,
+    dataType: 'html',
+    url: url,
+    success: function(data) {
+      self.fixturesCache_[relativeUrl] = data;
+    },
+    error: function(jqXHR, status, errorThrown) {
+        throw Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')');
+    }
+  });
+};
+
+jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
+  return this[methodName].apply(this, passedArguments);
+};
+
+
+jasmine.JQuery = function() {};
+
+jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
+  return jQuery('<div/>').append(html).html();
+};
+
+jasmine.JQuery.elementToString = function(element) {
+  return jQuery('<div />').append(element.clone()).html();
+};
+
+jasmine.JQuery.matchersClass = {};
+
+(function(namespace) {
+  var data = {
+    spiedEvents: {},
+    handlers:    []
+  };
+
+  namespace.events = {
+    spyOn: function(selector, eventName) {
+      var handler = function(e) {
+        data.spiedEvents[[selector, eventName]] = e;
+      };
+      jQuery(selector).bind(eventName, handler);
+      data.handlers.push(handler);
+    },
+
+    wasTriggered: function(selector, eventName) {
+      return !!(data.spiedEvents[[selector, eventName]]);
+    },
+
+    cleanUp: function() {
+      data.spiedEvents = {};
+      data.handlers    = [];
+    }
+  }
+})(jasmine.JQuery);
+
+(function(){
+  var jQueryMatchers = {
+    toHaveClass: function(className) {
+      return this.actual.hasClass(className);
+    },
+
+    toBeVisible: function() {
+      return this.actual.is(':visible');
+    },
+
+    toBeHidden: function() {
+      return this.actual.is(':hidden');
+    },
+
+    toBeSelected: function() {
+      return this.actual.is(':selected');
+    },
+
+    toBeChecked: function() {
+      return this.actual.is(':checked');
+    },
+
+    toBeEmpty: function() {
+      return this.actual.is(':empty');
+    },
+
+    toExist: function() {
+      return this.actual.size() > 0;
+    },
+
+    toHaveAttr: function(attributeName, expectedAttributeValue) {
+      return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
+    },
+
+    toHaveId: function(id) {
+      return this.actual.attr('id') == id;
+    },
+
+    toHaveHtml: function(html) {
+      return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
+    },
+
+    toHaveText: function(text) {
+      if (text && jQuery.isFunction(text.test)) {
+        return text.test(this.actual.text());
+      } else {
+        return this.actual.text() == text;
+      }
+    },
+
+    toHaveValue: function(value) {
+      return this.actual.val() == value;
+    },
+
+    toHaveData: function(key, expectedValue) {
+      return hasProperty(this.actual.data(key), expectedValue);
+    },
+
+    toBe: function(selector) {
+      return this.actual.is(selector);
+    },
+
+    toContain: function(selector) {
+      return this.actual.find(selector).size() > 0;
+    },
+
+    toBeDisabled: function(selector){
+      return this.actual.is(':disabled');
+    },
+
+    // tests the existence of a specific event binding
+    toHandle: function(eventName) {
+      var events = this.actual.data("events");
+      return events && events[eventName].length > 0;
+    },
+    
+    // tests the existence of a specific event binding + handler
+    toHandleWith: function(eventName, eventHandler) {
+      var stack = this.actual.data("events")[eventName];
+      var i;
+      for (i = 0; i < stack.length; i++) {
+        if (stack[i].handler == eventHandler) {
+          return true;
+        }
+      }
+      return false;
+    }
+  };
+
+  var hasProperty = function(actualValue, expectedValue) {
+    if (expectedValue === undefined) {
+      return actualValue !== undefined;
+    }
+    return actualValue == expectedValue;
+  };
+
+  var bindMatcher = function(methodName) {
+    var builtInMatcher = jasmine.Matchers.prototype[methodName];
+
+    jasmine.JQuery.matchersClass[methodName] = function() {
+      if (this.actual instanceof jQuery) {
+        var result = jQueryMatchers[methodName].apply(this, arguments);
+        this.actual = jasmine.JQuery.elementToString(this.actual);
+        return result;
+      }
+
+      if (builtInMatcher) {
+        return builtInMatcher.apply(this, arguments);
+      }
+
+      return false;
+    };
+  };
+
+  for(var methodName in jQueryMatchers) {
+    bindMatcher(methodName);
+  }
+})();
+
+beforeEach(function() {
+  this.addMatchers(jasmine.JQuery.matchersClass);
+  this.addMatchers({
+    toHaveBeenTriggeredOn: function(selector) {
+      this.message = function() {
+        return [
+          "Expected event " + this.actual + " to have been triggered on" + selector,
+          "Expected event " + this.actual + " not to have been triggered on" + selector
+        ];
+      };
+      return jasmine.JQuery.events.wasTriggered(selector, this.actual);
+    }
+  })
+});
+
+afterEach(function() {
+  jasmine.getFixtures().cleanUp();
+  jasmine.JQuery.events.cleanUp();
+});
diff --git a/Tom-Marble/deck.js/test/lib/jasmine.css b/Tom-Marble/deck.js/test/lib/jasmine.css
new file mode 100755 (executable)
index 0000000..6583fe7
--- /dev/null
@@ -0,0 +1,166 @@
+body {
+  font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
+}
+
+
+.jasmine_reporter a:visited, .jasmine_reporter a {
+  color: #303; 
+}
+
+.jasmine_reporter a:hover, .jasmine_reporter a:active {
+  color: blue; 
+}
+
+.run_spec {
+  float:right;
+  padding-right: 5px;
+  font-size: .8em;
+  text-decoration: none;
+}
+
+.jasmine_reporter {
+  margin: 0 5px;
+}
+
+.banner {
+  color: #303;
+  background-color: #fef;
+  padding: 5px;
+}
+
+.logo {
+  float: left;
+  font-size: 1.1em;
+  padding-left: 5px;
+}
+
+.logo .version {
+  font-size: .6em;
+  padding-left: 1em;
+}
+
+.runner.running {
+  background-color: yellow;
+}
+
+
+.options {
+  text-align: right;
+  font-size: .8em;
+}
+
+
+
+
+.suite {
+  border: 1px outset gray;
+  margin: 5px 0;
+  padding-left: 1em;
+}
+
+.suite .suite {
+  margin: 5px; 
+}
+
+.suite.passed {
+  background-color: #dfd;
+}
+
+.suite.failed {
+  background-color: #fdd;
+}
+
+.spec {
+  margin: 5px;
+  padding-left: 1em;
+  clear: both;
+}
+
+.spec.failed, .spec.passed, .spec.skipped {
+  padding-bottom: 5px;
+  border: 1px solid gray;
+}
+
+.spec.failed {
+  background-color: #fbb;
+  border-color: red;
+}
+
+.spec.passed {
+  background-color: #bfb;
+  border-color: green;
+}
+
+.spec.skipped {
+  background-color: #bbb;
+}
+
+.messages {
+  border-left: 1px dashed gray;
+  padding-left: 1em;
+  padding-right: 1em;
+}
+
+.passed {
+  background-color: #cfc;
+  display: none;
+}
+
+.failed {
+  background-color: #fbb;
+}
+
+.skipped {
+  color: #777;
+  background-color: #eee;
+  display: none;
+}
+
+
+/*.resultMessage {*/
+  /*white-space: pre;*/
+/*}*/
+
+.resultMessage span.result {
+  display: block;
+  line-height: 2em;
+  color: black;
+}
+
+.resultMessage .mismatch {
+  color: black;
+}
+
+.stackTrace {
+  white-space: pre;
+  font-size: .8em;
+  margin-left: 10px;
+  max-height: 5em;
+  overflow: auto;
+  border: 1px inset red;
+  padding: 1em;
+  background: #eef;
+}
+
+.finished-at {
+  padding-left: 1em;
+  font-size: .6em;
+}
+
+.show-passed .passed,
+.show-skipped .skipped {
+  display: block;
+}
+
+
+#jasmine_content {
+  position:fixed;
+  right: 100%;
+}
+
+.runner {
+  border: 1px solid gray;
+  display: block;
+  margin: 5px 0;
+  padding: 2px 0 2px 10px;
+}
diff --git a/Tom-Marble/deck.js/test/lib/jasmine.js b/Tom-Marble/deck.js/test/lib/jasmine.js
new file mode 100755 (executable)
index 0000000..e96e0a7
--- /dev/null
@@ -0,0 +1,2477 @@
+var isCommonJS = typeof window == "undefined";
+
+/**
+ * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
+ *
+ * @namespace
+ */
+var jasmine = {};
+if (isCommonJS) exports.jasmine = jasmine;
+/**
+ * @private
+ */
+jasmine.unimplementedMethod_ = function() {
+  throw new Error("unimplemented method");
+};
+
+/**
+ * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
+ * a plain old variable and may be redefined by somebody else.
+ *
+ * @private
+ */
+jasmine.undefined = jasmine.___undefined___;
+
+/**
+ * Show diagnostic messages in the console if set to true
+ *
+ */
+jasmine.VERBOSE = false;
+
+/**
+ * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
+ *
+ */
+jasmine.DEFAULT_UPDATE_INTERVAL = 250;
+
+/**
+ * Default timeout interval in milliseconds for waitsFor() blocks.
+ */
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
+
+jasmine.getGlobal = function() {
+  function getGlobal() {
+    return this;
+  }
+
+  return getGlobal();
+};
+
+/**
+ * Allows for bound functions to be compared.  Internal use only.
+ *
+ * @ignore
+ * @private
+ * @param base {Object} bound 'this' for the function
+ * @param name {Function} function to find
+ */
+jasmine.bindOriginal_ = function(base, name) {
+  var original = base[name];
+  if (original.apply) {
+    return function() {
+      return original.apply(base, arguments);
+    };
+  } else {
+    // IE support
+    return jasmine.getGlobal()[name];
+  }
+};
+
+jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
+jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
+jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
+jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
+
+jasmine.MessageResult = function(values) {
+  this.type = 'log';
+  this.values = values;
+  this.trace = new Error(); // todo: test better
+};
+
+jasmine.MessageResult.prototype.toString = function() {
+  var text = "";
+  for (var i = 0; i < this.values.length; i++) {
+    if (i > 0) text += " ";
+    if (jasmine.isString_(this.values[i])) {
+      text += this.values[i];
+    } else {
+      text += jasmine.pp(this.values[i]);
+    }
+  }
+  return text;
+};
+
+jasmine.ExpectationResult = function(params) {
+  this.type = 'expect';
+  this.matcherName = params.matcherName;
+  this.passed_ = params.passed;
+  this.expected = params.expected;
+  this.actual = params.actual;
+  this.message = this.passed_ ? 'Passed.' : params.message;
+
+  var trace = (params.trace || new Error(this.message));
+  this.trace = this.passed_ ? '' : trace;
+};
+
+jasmine.ExpectationResult.prototype.toString = function () {
+  return this.message;
+};
+
+jasmine.ExpectationResult.prototype.passed = function () {
+  return this.passed_;
+};
+
+/**
+ * Getter for the Jasmine environment. Ensures one gets created
+ */
+jasmine.getEnv = function() {
+  var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
+  return env;
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isArray_ = function(value) {
+  return jasmine.isA_("Array", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isString_ = function(value) {
+  return jasmine.isA_("String", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isNumber_ = function(value) {
+  return jasmine.isA_("Number", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param {String} typeName
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isA_ = function(typeName, value) {
+  return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
+};
+
+/**
+ * Pretty printer for expecations.  Takes any object and turns it into a human-readable string.
+ *
+ * @param value {Object} an object to be outputted
+ * @returns {String}
+ */
+jasmine.pp = function(value) {
+  var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
+  stringPrettyPrinter.format(value);
+  return stringPrettyPrinter.string;
+};
+
+/**
+ * Returns true if the object is a DOM Node.
+ *
+ * @param {Object} obj object to check
+ * @returns {Boolean}
+ */
+jasmine.isDomNode = function(obj) {
+  return obj.nodeType > 0;
+};
+
+/**
+ * Returns a matchable 'generic' object of the class type.  For use in expecations of type when values don't matter.
+ *
+ * @example
+ * // don't care about which function is passed in, as long as it's a function
+ * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
+ *
+ * @param {Class} clazz
+ * @returns matchable object of the type clazz
+ */
+jasmine.any = function(clazz) {
+  return new jasmine.Matchers.Any(clazz);
+};
+
+/**
+ * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
+ *
+ * Spies should be created in test setup, before expectations.  They can then be checked, using the standard Jasmine
+ * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
+ *
+ * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
+ *
+ * Spies are torn down at the end of every spec.
+ *
+ * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
+ *
+ * @example
+ * // a stub
+ * var myStub = jasmine.createSpy('myStub');  // can be used anywhere
+ *
+ * // spy example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ *
+ * // actual foo.not will not be called, execution stops
+ * spyOn(foo, 'not');
+
+ // foo.not spied upon, execution will continue to implementation
+ * spyOn(foo, 'not').andCallThrough();
+ *
+ * // fake example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ *
+ * // foo.not(val) will return val
+ * spyOn(foo, 'not').andCallFake(function(value) {return value;});
+ *
+ * // mock example
+ * foo.not(7 == 7);
+ * expect(foo.not).toHaveBeenCalled();
+ * expect(foo.not).toHaveBeenCalledWith(true);
+ *
+ * @constructor
+ * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
+ * @param {String} name
+ */
+jasmine.Spy = function(name) {
+  /**
+   * The name of the spy, if provided.
+   */
+  this.identity = name || 'unknown';
+  /**
+   *  Is this Object a spy?
+   */
+  this.isSpy = true;
+  /**
+   * The actual function this spy stubs.
+   */
+  this.plan = function() {
+  };
+  /**
+   * Tracking of the most recent call to the spy.
+   * @example
+   * var mySpy = jasmine.createSpy('foo');
+   * mySpy(1, 2);
+   * mySpy.mostRecentCall.args = [1, 2];
+   */
+  this.mostRecentCall = {};
+
+  /**
+   * Holds arguments for each call to the spy, indexed by call count
+   * @example
+   * var mySpy = jasmine.createSpy('foo');
+   * mySpy(1, 2);
+   * mySpy(7, 8);
+   * mySpy.mostRecentCall.args = [7, 8];
+   * mySpy.argsForCall[0] = [1, 2];
+   * mySpy.argsForCall[1] = [7, 8];
+   */
+  this.argsForCall = [];
+  this.calls = [];
+};
+
+/**
+ * Tells a spy to call through to the actual implemenatation.
+ *
+ * @example
+ * var foo = {
+ *   bar: function() { // do some stuff }
+ * }
+ *
+ * // defining a spy on an existing property: foo.bar
+ * spyOn(foo, 'bar').andCallThrough();
+ */
+jasmine.Spy.prototype.andCallThrough = function() {
+  this.plan = this.originalValue;
+  return this;
+};
+
+/**
+ * For setting the return value of a spy.
+ *
+ * @example
+ * // defining a spy from scratch: foo() returns 'baz'
+ * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() returns 'baz'
+ * spyOn(foo, 'bar').andReturn('baz');
+ *
+ * @param {Object} value
+ */
+jasmine.Spy.prototype.andReturn = function(value) {
+  this.plan = function() {
+    return value;
+  };
+  return this;
+};
+
+/**
+ * For throwing an exception when a spy is called.
+ *
+ * @example
+ * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
+ * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
+ * spyOn(foo, 'bar').andThrow('baz');
+ *
+ * @param {String} exceptionMsg
+ */
+jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
+  this.plan = function() {
+    throw exceptionMsg;
+  };
+  return this;
+};
+
+/**
+ * Calls an alternate implementation when a spy is called.
+ *
+ * @example
+ * var baz = function() {
+ *   // do some stuff, return something
+ * }
+ * // defining a spy from scratch: foo() calls the function baz
+ * var foo = jasmine.createSpy('spy on foo').andCall(baz);
+ *
+ * // defining a spy on an existing property: foo.bar() calls an anonymnous function
+ * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
+ *
+ * @param {Function} fakeFunc
+ */
+jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
+  this.plan = fakeFunc;
+  return this;
+};
+
+/**
+ * Resets all of a spy's the tracking variables so that it can be used again.
+ *
+ * @example
+ * spyOn(foo, 'bar');
+ *
+ * foo.bar();
+ *
+ * expect(foo.bar.callCount).toEqual(1);
+ *
+ * foo.bar.reset();
+ *
+ * expect(foo.bar.callCount).toEqual(0);
+ */
+jasmine.Spy.prototype.reset = function() {
+  this.wasCalled = false;
+  this.callCount = 0;
+  this.argsForCall = [];
+  this.calls = [];
+  this.mostRecentCall = {};
+};
+
+jasmine.createSpy = function(name) {
+
+  var spyObj = function() {
+    spyObj.wasCalled = true;
+    spyObj.callCount++;
+    var args = jasmine.util.argsToArray(arguments);
+    spyObj.mostRecentCall.object = this;
+    spyObj.mostRecentCall.args = args;
+    spyObj.argsForCall.push(args);
+    spyObj.calls.push({object: this, args: args});
+    return spyObj.plan.apply(this, arguments);
+  };
+
+  var spy = new jasmine.Spy(name);
+
+  for (var prop in spy) {
+    spyObj[prop] = spy[prop];
+  }
+
+  spyObj.reset();
+
+  return spyObj;
+};
+
+/**
+ * Determines whether an object is a spy.
+ *
+ * @param {jasmine.Spy|Object} putativeSpy
+ * @returns {Boolean}
+ */
+jasmine.isSpy = function(putativeSpy) {
+  return putativeSpy && putativeSpy.isSpy;
+};
+
+/**
+ * Creates a more complicated spy: an Object that has every property a function that is a spy.  Used for stubbing something
+ * large in one call.
+ *
+ * @param {String} baseName name of spy class
+ * @param {Array} methodNames array of names of methods to make spies
+ */
+jasmine.createSpyObj = function(baseName, methodNames) {
+  if (!jasmine.isArray_(methodNames) || methodNames.length === 0) {
+    throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
+  }
+  var obj = {};
+  for (var i = 0; i < methodNames.length; i++) {
+    obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
+  }
+  return obj;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.log = function() {
+  var spec = jasmine.getEnv().currentSpec;
+  spec.log.apply(spec, arguments);
+};
+
+/**
+ * Function that installs a spy on an existing object's method name.  Used within a Spec to create a spy.
+ *
+ * @example
+ * // spy example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
+ *
+ * @see jasmine.createSpy
+ * @param obj
+ * @param methodName
+ * @returns a Jasmine spy that can be chained with all spy methods
+ */
+var spyOn = function(obj, methodName) {
+  return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
+};
+if (isCommonJS) exports.spyOn = spyOn;
+
+/**
+ * Creates a Jasmine spec that will be added to the current suite.
+ *
+ * // TODO: pending tests
+ *
+ * @example
+ * it('should be true', function() {
+ *   expect(true).toEqual(true);
+ * });
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var it = function(desc, func) {
+  return jasmine.getEnv().it(desc, func);
+};
+if (isCommonJS) exports.it = it;
+
+/**
+ * Creates a <em>disabled</em> Jasmine spec.
+ *
+ * A convenience method that allows existing specs to be disabled temporarily during development.
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var xit = function(desc, func) {
+  return jasmine.getEnv().xit(desc, func);
+};
+if (isCommonJS) exports.xit = xit;
+
+/**
+ * Starts a chain for a Jasmine expectation.
+ *
+ * It is passed an Object that is the actual value and should chain to one of the many
+ * jasmine.Matchers functions.
+ *
+ * @param {Object} actual Actual value to test against and expected value
+ */
+var expect = function(actual) {
+  return jasmine.getEnv().currentSpec.expect(actual);
+};
+if (isCommonJS) exports.expect = expect;
+
+/**
+ * Defines part of a jasmine spec.  Used in cominbination with waits or waitsFor in asynchrnous specs.
+ *
+ * @param {Function} func Function that defines part of a jasmine spec.
+ */
+var runs = function(func) {
+  jasmine.getEnv().currentSpec.runs(func);
+};
+if (isCommonJS) exports.runs = runs;
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+var waits = function(timeout) {
+  jasmine.getEnv().currentSpec.waits(timeout);
+};
+if (isCommonJS) exports.waits = waits;
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+  jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
+};
+if (isCommonJS) exports.waitsFor = waitsFor;
+
+/**
+ * A function that is called before each spec in a suite.
+ *
+ * Used for spec setup, including validating assumptions.
+ *
+ * @param {Function} beforeEachFunction
+ */
+var beforeEach = function(beforeEachFunction) {
+  jasmine.getEnv().beforeEach(beforeEachFunction);
+};
+if (isCommonJS) exports.beforeEach = beforeEach;
+
+/**
+ * A function that is called after each spec in a suite.
+ *
+ * Used for restoring any state that is hijacked during spec execution.
+ *
+ * @param {Function} afterEachFunction
+ */
+var afterEach = function(afterEachFunction) {
+  jasmine.getEnv().afterEach(afterEachFunction);
+};
+if (isCommonJS) exports.afterEach = afterEach;
+
+/**
+ * Defines a suite of specifications.
+ *
+ * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
+ * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
+ * of setup in some tests.
+ *
+ * @example
+ * // TODO: a simple suite
+ *
+ * // TODO: a simple suite with a nested describe block
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var describe = function(description, specDefinitions) {
+  return jasmine.getEnv().describe(description, specDefinitions);
+};
+if (isCommonJS) exports.describe = describe;
+
+/**
+ * Disables a suite of specifications.  Used to disable some suites in a file, or files, temporarily during development.
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var xdescribe = function(description, specDefinitions) {
+  return jasmine.getEnv().xdescribe(description, specDefinitions);
+};
+if (isCommonJS) exports.xdescribe = xdescribe;
+
+
+// Provide the XMLHttpRequest class for IE 5.x-6.x:
+jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
+  function tryIt(f) {
+    try {
+      return f();
+    } catch(e) {
+    }
+    return null;
+  }
+
+  var xhr = tryIt(function() {
+    return new ActiveXObject("Msxml2.XMLHTTP.6.0");
+  }) ||
+    tryIt(function() {
+      return new ActiveXObject("Msxml2.XMLHTTP.3.0");
+    }) ||
+    tryIt(function() {
+      return new ActiveXObject("Msxml2.XMLHTTP");
+    }) ||
+    tryIt(function() {
+      return new ActiveXObject("Microsoft.XMLHTTP");
+    });
+
+  if (!xhr) throw new Error("This browser does not support XMLHttpRequest.");
+
+  return xhr;
+} : XMLHttpRequest;
+/**
+ * @namespace
+ */
+jasmine.util = {};
+
+/**
+ * Declare that a child class inherit it's prototype from the parent class.
+ *
+ * @private
+ * @param {Function} childClass
+ * @param {Function} parentClass
+ */
+jasmine.util.inherit = function(childClass, parentClass) {
+  /**
+   * @private
+   */
+  var subclass = function() {
+  };
+  subclass.prototype = parentClass.prototype;
+  childClass.prototype = new subclass();
+};
+
+jasmine.util.formatException = function(e) {
+  var lineNumber;
+  if (e.line) {
+    lineNumber = e.line;
+  }
+  else if (e.lineNumber) {
+    lineNumber = e.lineNumber;
+  }
+
+  var file;
+
+  if (e.sourceURL) {
+    file = e.sourceURL;
+  }
+  else if (e.fileName) {
+    file = e.fileName;
+  }
+
+  var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
+
+  if (file && lineNumber) {
+    message += ' in ' + file + ' (line ' + lineNumber + ')';
+  }
+
+  return message;
+};
+
+jasmine.util.htmlEscape = function(str) {
+  if (!str) return str;
+  return str.replace(/&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;');
+};
+
+jasmine.util.argsToArray = function(args) {
+  var arrayOfArgs = [];
+  for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
+  return arrayOfArgs;
+};
+
+jasmine.util.extend = function(destination, source) {
+  for (var property in source) destination[property] = source[property];
+  return destination;
+};
+
+/**
+ * Environment for Jasmine
+ *
+ * @constructor
+ */
+jasmine.Env = function() {
+  this.currentSpec = null;
+  this.currentSuite = null;
+  this.currentRunner_ = new jasmine.Runner(this);
+
+  this.reporter = new jasmine.MultiReporter();
+
+  this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
+  this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
+  this.lastUpdate = 0;
+  this.specFilter = function() {
+    return true;
+  };
+
+  this.nextSpecId_ = 0;
+  this.nextSuiteId_ = 0;
+  this.equalityTesters_ = [];
+
+  // wrap matchers
+  this.matchersClass = function() {
+    jasmine.Matchers.apply(this, arguments);
+  };
+  jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
+
+  jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
+};
+
+
+jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
+jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
+jasmine.Env.prototype.setInterval = jasmine.setInterval;
+jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
+
+/**
+ * @returns an object containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.version = function () {
+  if (jasmine.version_) {
+    return jasmine.version_;
+  } else {
+    throw new Error('Version not set');
+  }
+};
+
+/**
+ * @returns string containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.versionString = function() {
+  if (!jasmine.version_) {
+    return "version unknown";
+  }
+
+  var version = this.version();
+  var versionString = version.major + "." + version.minor + "." + version.build;
+  if (version.release_candidate) {
+    versionString += ".rc" + version.release_candidate
+  }
+  versionString += " revision " + version.revision;
+  return versionString;
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSpecId = function () {
+  return this.nextSpecId_++;
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSuiteId = function () {
+  return this.nextSuiteId_++;
+};
+
+/**
+ * Register a reporter to receive status updates from Jasmine.
+ * @param {jasmine.Reporter} reporter An object which will receive status updates.
+ */
+jasmine.Env.prototype.addReporter = function(reporter) {
+  this.reporter.addReporter(reporter);
+};
+
+jasmine.Env.prototype.execute = function() {
+  this.currentRunner_.execute();
+};
+
+jasmine.Env.prototype.describe = function(description, specDefinitions) {
+  var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
+
+  var parentSuite = this.currentSuite;
+  if (parentSuite) {
+    parentSuite.add(suite);
+  } else {
+    this.currentRunner_.add(suite);
+  }
+
+  this.currentSuite = suite;
+
+  var declarationError = null;
+  try {
+    specDefinitions.call(suite);
+  } catch(e) {
+    declarationError = e;
+  }
+
+  if (declarationError) {
+    this.it("encountered a declaration exception", function() {
+      throw declarationError;
+    });
+  }
+
+  this.currentSuite = parentSuite;
+
+  return suite;
+};
+
+jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
+  if (this.currentSuite) {
+    this.currentSuite.beforeEach(beforeEachFunction);
+  } else {
+    this.currentRunner_.beforeEach(beforeEachFunction);
+  }
+};
+
+jasmine.Env.prototype.currentRunner = function () {
+  return this.currentRunner_;
+};
+
+jasmine.Env.prototype.afterEach = function(afterEachFunction) {
+  if (this.currentSuite) {
+    this.currentSuite.afterEach(afterEachFunction);
+  } else {
+    this.currentRunner_.afterEach(afterEachFunction);
+  }
+
+};
+
+jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
+  return {
+    execute: function() {
+    }
+  };
+};
+
+jasmine.Env.prototype.it = function(description, func) {
+  var spec = new jasmine.Spec(this, this.currentSuite, description);
+  this.currentSuite.add(spec);
+  this.currentSpec = spec;
+
+  if (func) {
+    spec.runs(func);
+  }
+
+  return spec;
+};
+
+jasmine.Env.prototype.xit = function(desc, func) {
+  return {
+    id: this.nextSpecId(),
+    runs: function() {
+    }
+  };
+};
+
+jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
+  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
+    return true;
+  }
+
+  a.__Jasmine_been_here_before__ = b;
+  b.__Jasmine_been_here_before__ = a;
+
+  var hasKey = function(obj, keyName) {
+    return obj !== null && obj[keyName] !== jasmine.undefined;
+  };
+
+  for (var property in b) {
+    if (!hasKey(a, property) && hasKey(b, property)) {
+      mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
+    }
+  }
+  for (property in a) {
+    if (!hasKey(b, property) && hasKey(a, property)) {
+      mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
+    }
+  }
+  for (property in b) {
+    if (property == '__Jasmine_been_here_before__') continue;
+    if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
+      mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
+    }
+  }
+
+  if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
+    mismatchValues.push("arrays were not the same length");
+  }
+
+  delete a.__Jasmine_been_here_before__;
+  delete b.__Jasmine_been_here_before__;
+  return (mismatchKeys.length === 0 && mismatchValues.length === 0);
+};
+
+jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
+  mismatchKeys = mismatchKeys || [];
+  mismatchValues = mismatchValues || [];
+
+  for (var i = 0; i < this.equalityTesters_.length; i++) {
+    var equalityTester = this.equalityTesters_[i];
+    var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
+    if (result !== jasmine.undefined) return result;
+  }
+
+  if (a === b) return true;
+
+  if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
+    return (a == jasmine.undefined && b == jasmine.undefined);
+  }
+
+  if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
+    return a === b;
+  }
+
+  if (a instanceof Date && b instanceof Date) {
+    return a.getTime() == b.getTime();
+  }
+
+  if (a instanceof jasmine.Matchers.Any) {
+    return a.matches(b);
+  }
+
+  if (b instanceof jasmine.Matchers.Any) {
+    return b.matches(a);
+  }
+
+  if (jasmine.isString_(a) && jasmine.isString_(b)) {
+    return (a == b);
+  }
+
+  if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
+    return (a == b);
+  }
+
+  if (typeof a === "object" && typeof b === "object") {
+    return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
+  }
+
+  //Straight check
+  return (a === b);
+};
+
+jasmine.Env.prototype.contains_ = function(haystack, needle) {
+  if (jasmine.isArray_(haystack)) {
+    for (var i = 0; i < haystack.length; i++) {
+      if (this.equals_(haystack[i], needle)) return true;
+    }
+    return false;
+  }
+  return haystack.indexOf(needle) >= 0;
+};
+
+jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
+  this.equalityTesters_.push(equalityTester);
+};
+/** No-op base class for Jasmine reporters.
+ *
+ * @constructor
+ */
+jasmine.Reporter = function() {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecResults = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.log = function(str) {
+};
+
+/**
+ * Blocks are functions with executable code that make up a spec.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {Function} func
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Block = function(env, func, spec) {
+  this.env = env;
+  this.func = func;
+  this.spec = spec;
+};
+
+jasmine.Block.prototype.execute = function(onComplete) {  
+  try {
+    this.func.apply(this.spec);
+  } catch (e) {
+    this.spec.fail(e);
+  }
+  onComplete();
+};
+/** JavaScript API reporter.
+ *
+ * @constructor
+ */
+jasmine.JsApiReporter = function() {
+  this.started = false;
+  this.finished = false;
+  this.suites_ = [];
+  this.results_ = {};
+};
+
+jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
+  this.started = true;
+  var suites = runner.topLevelSuites();
+  for (var i = 0; i < suites.length; i++) {
+    var suite = suites[i];
+    this.suites_.push(this.summarize_(suite));
+  }
+};
+
+jasmine.JsApiReporter.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
+  var isSuite = suiteOrSpec instanceof jasmine.Suite;
+  var summary = {
+    id: suiteOrSpec.id,
+    name: suiteOrSpec.description,
+    type: isSuite ? 'suite' : 'spec',
+    children: []
+  };
+  
+  if (isSuite) {
+    var children = suiteOrSpec.children();
+    for (var i = 0; i < children.length; i++) {
+      summary.children.push(this.summarize_(children[i]));
+    }
+  }
+  return summary;
+};
+
+jasmine.JsApiReporter.prototype.results = function() {
+  return this.results_;
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
+  return this.results_[specId];
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
+  this.finished = true;
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
+  this.results_[spec.id] = {
+    messages: spec.results().getItems(),
+    result: spec.results().failedCount > 0 ? "failed" : "passed"
+  };
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.log = function(str) {
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
+  var results = {};
+  for (var i = 0; i < specIds.length; i++) {
+    var specId = specIds[i];
+    results[specId] = this.summarizeResult_(this.results_[specId]);
+  }
+  return results;
+};
+
+jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
+  var summaryMessages = [];
+  var messagesLength = result.messages.length;
+  for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
+    var resultMessage = result.messages[messageIndex];
+    summaryMessages.push({
+      text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
+      passed: resultMessage.passed ? resultMessage.passed() : true,
+      type: resultMessage.type,
+      message: resultMessage.message,
+      trace: {
+        stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
+      }
+    });
+  }
+
+  return {
+    result : result.result,
+    messages : summaryMessages
+  };
+};
+
+/**
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param actual
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Matchers = function(env, actual, spec, opt_isNot) {
+  this.env = env;
+  this.actual = actual;
+  this.spec = spec;
+  this.isNot = opt_isNot || false;
+  this.reportWasCalled_ = false;
+};
+
+// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
+jasmine.Matchers.pp = function(str) {
+  throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
+};
+
+// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
+jasmine.Matchers.prototype.report = function(result, failing_message, details) {
+  throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
+};
+
+jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
+  for (var methodName in prototype) {
+    if (methodName == 'report') continue;
+    var orig = prototype[methodName];
+    matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
+  }
+};
+
+jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
+  return function() {
+    var matcherArgs = jasmine.util.argsToArray(arguments);
+    var result = matcherFunction.apply(this, arguments);
+
+    if (this.isNot) {
+      result = !result;
+    }
+
+    if (this.reportWasCalled_) return result;
+
+    var message;
+    if (!result) {
+      if (this.message) {
+        message = this.message.apply(this, arguments);
+        if (jasmine.isArray_(message)) {
+          message = message[this.isNot ? 1 : 0];
+        }
+      } else {
+        var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
+        message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
+        if (matcherArgs.length > 0) {
+          for (var i = 0; i < matcherArgs.length; i++) {
+            if (i > 0) message += ",";
+            message += " " + jasmine.pp(matcherArgs[i]);
+          }
+        }
+        message += ".";
+      }
+    }
+    var expectationResult = new jasmine.ExpectationResult({
+      matcherName: matcherName,
+      passed: result,
+      expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
+      actual: this.actual,
+      message: message
+    });
+    this.spec.addMatcherResult(expectationResult);
+    return jasmine.undefined;
+  };
+};
+
+
+
+
+/**
+ * toBe: compares the actual to the expected using ===
+ * @param expected
+ */
+jasmine.Matchers.prototype.toBe = function(expected) {
+  return this.actual === expected;
+};
+
+/**
+ * toNotBe: compares the actual to the expected using !==
+ * @param expected
+ * @deprecated as of 1.0. Use not.toBe() instead.
+ */
+jasmine.Matchers.prototype.toNotBe = function(expected) {
+  return this.actual !== expected;
+};
+
+/**
+ * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toEqual = function(expected) {
+  return this.env.equals_(this.actual, expected);
+};
+
+/**
+ * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
+ * @param expected
+ * @deprecated as of 1.0. Use not.toNotEqual() instead.
+ */
+jasmine.Matchers.prototype.toNotEqual = function(expected) {
+  return !this.env.equals_(this.actual, expected);
+};
+
+/**
+ * Matcher that compares the actual to the expected using a regular expression.  Constructs a RegExp, so takes
+ * a pattern or a String.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toMatch = function(expected) {
+  return new RegExp(expected).test(this.actual);
+};
+
+/**
+ * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
+ * @param expected
+ * @deprecated as of 1.0. Use not.toMatch() instead.
+ */
+jasmine.Matchers.prototype.toNotMatch = function(expected) {
+  return !(new RegExp(expected).test(this.actual));
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeDefined = function() {
+  return (this.actual !== jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeUndefined = function() {
+  return (this.actual === jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to null.
+ */
+jasmine.Matchers.prototype.toBeNull = function() {
+  return (this.actual === null);
+};
+
+/**
+ * Matcher that boolean not-nots the actual.
+ */
+jasmine.Matchers.prototype.toBeTruthy = function() {
+  return !!this.actual;
+};
+
+
+/**
+ * Matcher that boolean nots the actual.
+ */
+jasmine.Matchers.prototype.toBeFalsy = function() {
+  return !this.actual;
+};
+
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called.
+ */
+jasmine.Matchers.prototype.toHaveBeenCalled = function() {
+  if (arguments.length > 0) {
+    throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
+  }
+
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy " + this.actual.identity + " to have been called.",
+      "Expected spy " + this.actual.identity + " not to have been called."
+    ];
+  };
+
+  return this.actual.wasCalled;
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
+jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was not called.
+ *
+ * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
+ */
+jasmine.Matchers.prototype.wasNotCalled = function() {
+  if (arguments.length > 0) {
+    throw new Error('wasNotCalled does not take arguments');
+  }
+
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy " + this.actual.identity + " to not have been called.",
+      "Expected spy " + this.actual.identity + " to have been called."
+    ];
+  };
+
+  return !this.actual.wasCalled;
+};
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
+ *
+ * @example
+ *
+ */
+jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
+  var expectedArgs = jasmine.util.argsToArray(arguments);
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+  this.message = function() {
+    if (this.actual.callCount === 0) {
+      // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
+      return [
+        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
+        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
+      ];
+    } else {
+      return [
+        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
+        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
+      ];
+    }
+  };
+
+  return this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
+
+/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasNotCalledWith = function() {
+  var expectedArgs = jasmine.util.argsToArray(arguments);
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
+      "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
+    ];
+  };
+
+  return !this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/**
+ * Matcher that checks that the expected item is an element in the actual Array.
+ *
+ * @param {Object} expected
+ */
+jasmine.Matchers.prototype.toContain = function(expected) {
+  return this.env.contains_(this.actual, expected);
+};
+
+/**
+ * Matcher that checks that the expected item is NOT an element in the actual Array.
+ *
+ * @param {Object} expected
+ * @deprecated as of 1.0. Use not.toNotContain() instead.
+ */
+jasmine.Matchers.prototype.toNotContain = function(expected) {
+  return !this.env.contains_(this.actual, expected);
+};
+
+jasmine.Matchers.prototype.toBeLessThan = function(expected) {
+  return this.actual < expected;
+};
+
+jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
+  return this.actual > expected;
+};
+
+/**
+ * Matcher that checks that the expected item is equal to the actual item
+ * up to a given level of decimal precision (default 2).
+ *
+ * @param {Number} expected
+ * @param {Number} precision
+ */
+jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) {
+  if (!(precision === 0)) {
+    precision = precision || 2;
+  }
+  var multiplier = Math.pow(10, precision);
+  var actual = Math.round(this.actual * multiplier);
+  expected = Math.round(expected * multiplier);
+  return expected == actual;
+};
+
+/**
+ * Matcher that checks that the expected exception was thrown by the actual.
+ *
+ * @param {String} expected
+ */
+jasmine.Matchers.prototype.toThrow = function(expected) {
+  var result = false;
+  var exception;
+  if (typeof this.actual != 'function') {
+    throw new Error('Actual is not a function');
+  }
+  try {
+    this.actual();
+  } catch (e) {
+    exception = e;
+  }
+  if (exception) {
+    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
+  }
+
+  var not = this.isNot ? "not " : "";
+
+  this.message = function() {
+    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
+      return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' ');
+    } else {
+      return "Expected function to throw an exception.";
+    }
+  };
+
+  return result;
+};
+
+jasmine.Matchers.Any = function(expectedClass) {
+  this.expectedClass = expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.matches = function(other) {
+  if (this.expectedClass == String) {
+    return typeof other == 'string' || other instanceof String;
+  }
+
+  if (this.expectedClass == Number) {
+    return typeof other == 'number' || other instanceof Number;
+  }
+
+  if (this.expectedClass == Function) {
+    return typeof other == 'function' || other instanceof Function;
+  }
+
+  if (this.expectedClass == Object) {
+    return typeof other == 'object';
+  }
+
+  return other instanceof this.expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.toString = function() {
+  return '<jasmine.any(' + this.expectedClass + ')>';
+};
+
+/**
+ * @constructor
+ */
+jasmine.MultiReporter = function() {
+  this.subReporters_ = [];
+};
+jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
+
+jasmine.MultiReporter.prototype.addReporter = function(reporter) {
+  this.subReporters_.push(reporter);
+};
+
+(function() {
+  var functionNames = [
+    "reportRunnerStarting",
+    "reportRunnerResults",
+    "reportSuiteResults",
+    "reportSpecStarting",
+    "reportSpecResults",
+    "log"
+  ];
+  for (var i = 0; i < functionNames.length; i++) {
+    var functionName = functionNames[i];
+    jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
+      return function() {
+        for (var j = 0; j < this.subReporters_.length; j++) {
+          var subReporter = this.subReporters_[j];
+          if (subReporter[functionName]) {
+            subReporter[functionName].apply(subReporter, arguments);
+          }
+        }
+      };
+    })(functionName);
+  }
+})();
+/**
+ * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
+ *
+ * @constructor
+ */
+jasmine.NestedResults = function() {
+  /**
+   * The total count of results
+   */
+  this.totalCount = 0;
+  /**
+   * Number of passed results
+   */
+  this.passedCount = 0;
+  /**
+   * Number of failed results
+   */
+  this.failedCount = 0;
+  /**
+   * Was this suite/spec skipped?
+   */
+  this.skipped = false;
+  /**
+   * @ignore
+   */
+  this.items_ = [];
+};
+
+/**
+ * Roll up the result counts.
+ *
+ * @param result
+ */
+jasmine.NestedResults.prototype.rollupCounts = function(result) {
+  this.totalCount += result.totalCount;
+  this.passedCount += result.passedCount;
+  this.failedCount += result.failedCount;
+};
+
+/**
+ * Adds a log message.
+ * @param values Array of message parts which will be concatenated later.
+ */
+jasmine.NestedResults.prototype.log = function(values) {
+  this.items_.push(new jasmine.MessageResult(values));
+};
+
+/**
+ * Getter for the results: message & results.
+ */
+jasmine.NestedResults.prototype.getItems = function() {
+  return this.items_;
+};
+
+/**
+ * Adds a result, tracking counts (total, passed, & failed)
+ * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
+ */
+jasmine.NestedResults.prototype.addResult = function(result) {
+  if (result.type != 'log') {
+    if (result.items_) {
+      this.rollupCounts(result);
+    } else {
+      this.totalCount++;
+      if (result.passed()) {
+        this.passedCount++;
+      } else {
+        this.failedCount++;
+      }
+    }
+  }
+  this.items_.push(result);
+};
+
+/**
+ * @returns {Boolean} True if <b>everything</b> below passed
+ */
+jasmine.NestedResults.prototype.passed = function() {
+  return this.passedCount === this.totalCount;
+};
+/**
+ * Base class for pretty printing for expectation results.
+ */
+jasmine.PrettyPrinter = function() {
+  this.ppNestLevel_ = 0;
+};
+
+/**
+ * Formats a value in a nice, human-readable string.
+ *
+ * @param value
+ */
+jasmine.PrettyPrinter.prototype.format = function(value) {
+  if (this.ppNestLevel_ > 40) {
+    throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
+  }
+
+  this.ppNestLevel_++;
+  try {
+    if (value === jasmine.undefined) {
+      this.emitScalar('undefined');
+    } else if (value === null) {
+      this.emitScalar('null');
+    } else if (value === jasmine.getGlobal()) {
+      this.emitScalar('<global>');
+    } else if (value instanceof jasmine.Matchers.Any) {
+      this.emitScalar(value.toString());
+    } else if (typeof value === 'string') {
+      this.emitString(value);
+    } else if (jasmine.isSpy(value)) {
+      this.emitScalar("spy on " + value.identity);
+    } else if (value instanceof RegExp) {
+      this.emitScalar(value.toString());
+    } else if (typeof value === 'function') {
+      this.emitScalar('Function');
+    } else if (typeof value.nodeType === 'number') {
+      this.emitScalar('HTMLNode');
+    } else if (value instanceof Date) {
+      this.emitScalar('Date(' + value + ')');
+    } else if (value.__Jasmine_been_here_before__) {
+      this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
+    } else if (jasmine.isArray_(value) || typeof value == 'object') {
+      value.__Jasmine_been_here_before__ = true;
+      if (jasmine.isArray_(value)) {
+        this.emitArray(value);
+      } else {
+        this.emitObject(value);
+      }
+      delete value.__Jasmine_been_here_before__;
+    } else {
+      this.emitScalar(value.toString());
+    }
+  } finally {
+    this.ppNestLevel_--;
+  }
+};
+
+jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
+  for (var property in obj) {
+    if (property == '__Jasmine_been_here_before__') continue;
+    fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && 
+                                         obj.__lookupGetter__(property) !== null) : false);
+  }
+};
+
+jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
+
+jasmine.StringPrettyPrinter = function() {
+  jasmine.PrettyPrinter.call(this);
+
+  this.string = '';
+};
+jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
+
+jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
+  this.append(value);
+};
+
+jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
+  this.append("'" + value + "'");
+};
+
+jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
+  this.append('[ ');
+  for (var i = 0; i < array.length; i++) {
+    if (i > 0) {
+      this.append(', ');
+    }
+    this.format(array[i]);
+  }
+  this.append(' ]');
+};
+
+jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
+  var self = this;
+  this.append('{ ');
+  var first = true;
+
+  this.iterateObject(obj, function(property, isGetter) {
+    if (first) {
+      first = false;
+    } else {
+      self.append(', ');
+    }
+
+    self.append(property);
+    self.append(' : ');
+    if (isGetter) {
+      self.append('<getter>');
+    } else {
+      self.format(obj[property]);
+    }
+  });
+
+  this.append(' }');
+};
+
+jasmine.StringPrettyPrinter.prototype.append = function(value) {
+  this.string += value;
+};
+jasmine.Queue = function(env) {
+  this.env = env;
+  this.blocks = [];
+  this.running = false;
+  this.index = 0;
+  this.offset = 0;
+  this.abort = false;
+};
+
+jasmine.Queue.prototype.addBefore = function(block) {
+  this.blocks.unshift(block);
+};
+
+jasmine.Queue.prototype.add = function(block) {
+  this.blocks.push(block);
+};
+
+jasmine.Queue.prototype.insertNext = function(block) {
+  this.blocks.splice((this.index + this.offset + 1), 0, block);
+  this.offset++;
+};
+
+jasmine.Queue.prototype.start = function(onComplete) {
+  this.running = true;
+  this.onComplete = onComplete;
+  this.next_();
+};
+
+jasmine.Queue.prototype.isRunning = function() {
+  return this.running;
+};
+
+jasmine.Queue.LOOP_DONT_RECURSE = true;
+
+jasmine.Queue.prototype.next_ = function() {
+  var self = this;
+  var goAgain = true;
+
+  while (goAgain) {
+    goAgain = false;
+    
+    if (self.index < self.blocks.length && !this.abort) {
+      var calledSynchronously = true;
+      var completedSynchronously = false;
+
+      var onComplete = function () {
+        if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
+          completedSynchronously = true;
+          return;
+        }
+
+        if (self.blocks[self.index].abort) {
+          self.abort = true;
+        }
+
+        self.offset = 0;
+        self.index++;
+
+        var now = new Date().getTime();
+        if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
+          self.env.lastUpdate = now;
+          self.env.setTimeout(function() {
+            self.next_();
+          }, 0);
+        } else {
+          if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
+            goAgain = true;
+          } else {
+            self.next_();
+          }
+        }
+      };
+      self.blocks[self.index].execute(onComplete);
+
+      calledSynchronously = false;
+      if (completedSynchronously) {
+        onComplete();
+      }
+      
+    } else {
+      self.running = false;
+      if (self.onComplete) {
+        self.onComplete();
+      }
+    }
+  }
+};
+
+jasmine.Queue.prototype.results = function() {
+  var results = new jasmine.NestedResults();
+  for (var i = 0; i < this.blocks.length; i++) {
+    if (this.blocks[i].results) {
+      results.addResult(this.blocks[i].results());
+    }
+  }
+  return results;
+};
+
+
+/**
+ * Runner
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ */
+jasmine.Runner = function(env) {
+  var self = this;
+  self.env = env;
+  self.queue = new jasmine.Queue(env);
+  self.before_ = [];
+  self.after_ = [];
+  self.suites_ = [];
+};
+
+jasmine.Runner.prototype.execute = function() {
+  var self = this;
+  if (self.env.reporter.reportRunnerStarting) {
+    self.env.reporter.reportRunnerStarting(this);
+  }
+  self.queue.start(function () {
+    self.finishCallback();
+  });
+};
+
+jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
+  beforeEachFunction.typeName = 'beforeEach';
+  this.before_.splice(0,0,beforeEachFunction);
+};
+
+jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
+  afterEachFunction.typeName = 'afterEach';
+  this.after_.splice(0,0,afterEachFunction);
+};
+
+
+jasmine.Runner.prototype.finishCallback = function() {
+  this.env.reporter.reportRunnerResults(this);
+};
+
+jasmine.Runner.prototype.addSuite = function(suite) {
+  this.suites_.push(suite);
+};
+
+jasmine.Runner.prototype.add = function(block) {
+  if (block instanceof jasmine.Suite) {
+    this.addSuite(block);
+  }
+  this.queue.add(block);
+};
+
+jasmine.Runner.prototype.specs = function () {
+  var suites = this.suites();
+  var specs = [];
+  for (var i = 0; i < suites.length; i++) {
+    specs = specs.concat(suites[i].specs());
+  }
+  return specs;
+};
+
+jasmine.Runner.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.Runner.prototype.topLevelSuites = function() {
+  var topLevelSuites = [];
+  for (var i = 0; i < this.suites_.length; i++) {
+    if (!this.suites_[i].parentSuite) {
+      topLevelSuites.push(this.suites_[i]);
+    }
+  }
+  return topLevelSuites;
+};
+
+jasmine.Runner.prototype.results = function() {
+  return this.queue.results();
+};
+/**
+ * Internal representation of a Jasmine specification, or test.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {jasmine.Suite} suite
+ * @param {String} description
+ */
+jasmine.Spec = function(env, suite, description) {
+  if (!env) {
+    throw new Error('jasmine.Env() required');
+  }
+  if (!suite) {
+    throw new Error('jasmine.Suite() required');
+  }
+  var spec = this;
+  spec.id = env.nextSpecId ? env.nextSpecId() : null;
+  spec.env = env;
+  spec.suite = suite;
+  spec.description = description;
+  spec.queue = new jasmine.Queue(env);
+
+  spec.afterCallbacks = [];
+  spec.spies_ = [];
+
+  spec.results_ = new jasmine.NestedResults();
+  spec.results_.description = description;
+  spec.matchersClass = null;
+};
+
+jasmine.Spec.prototype.getFullName = function() {
+  return this.suite.getFullName() + ' ' + this.description + '.';
+};
+
+
+jasmine.Spec.prototype.results = function() {
+  return this.results_;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.Spec.prototype.log = function() {
+  return this.results_.log(arguments);
+};
+
+jasmine.Spec.prototype.runs = function (func) {
+  var block = new jasmine.Block(this.env, func, this);
+  this.addToQueue(block);
+  return this;
+};
+
+jasmine.Spec.prototype.addToQueue = function (block) {
+  if (this.queue.isRunning()) {
+    this.queue.insertNext(block);
+  } else {
+    this.queue.add(block);
+  }
+};
+
+/**
+ * @param {jasmine.ExpectationResult} result
+ */
+jasmine.Spec.prototype.addMatcherResult = function(result) {
+  this.results_.addResult(result);
+};
+
+jasmine.Spec.prototype.expect = function(actual) {
+  var positive = new (this.getMatchersClass_())(this.env, actual, this);
+  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
+  return positive;
+};
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+jasmine.Spec.prototype.waits = function(timeout) {
+  var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
+  this.addToQueue(waitsFunc);
+  return this;
+};
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+  var latchFunction_ = null;
+  var optional_timeoutMessage_ = null;
+  var optional_timeout_ = null;
+
+  for (var i = 0; i < arguments.length; i++) {
+    var arg = arguments[i];
+    switch (typeof arg) {
+      case 'function':
+        latchFunction_ = arg;
+        break;
+      case 'string':
+        optional_timeoutMessage_ = arg;
+        break;
+      case 'number':
+        optional_timeout_ = arg;
+        break;
+    }
+  }
+
+  var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
+  this.addToQueue(waitsForFunc);
+  return this;
+};
+
+jasmine.Spec.prototype.fail = function (e) {
+  var expectationResult = new jasmine.ExpectationResult({
+    passed: false,
+    message: e ? jasmine.util.formatException(e) : 'Exception',
+    trace: { stack: e.stack }
+  });
+  this.results_.addResult(expectationResult);
+};
+
+jasmine.Spec.prototype.getMatchersClass_ = function() {
+  return this.matchersClass || this.env.matchersClass;
+};
+
+jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
+  var parent = this.getMatchersClass_();
+  var newMatchersClass = function() {
+    parent.apply(this, arguments);
+  };
+  jasmine.util.inherit(newMatchersClass, parent);
+  jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
+  this.matchersClass = newMatchersClass;
+};
+
+jasmine.Spec.prototype.finishCallback = function() {
+  this.env.reporter.reportSpecResults(this);
+};
+
+jasmine.Spec.prototype.finish = function(onComplete) {
+  this.removeAllSpies();
+  this.finishCallback();
+  if (onComplete) {
+    onComplete();
+  }
+};
+
+jasmine.Spec.prototype.after = function(doAfter) {
+  if (this.queue.isRunning()) {
+    this.queue.add(new jasmine.Block(this.env, doAfter, this));
+  } else {
+    this.afterCallbacks.unshift(doAfter);
+  }
+};
+
+jasmine.Spec.prototype.execute = function(onComplete) {
+  var spec = this;
+  if (!spec.env.specFilter(spec)) {
+    spec.results_.skipped = true;
+    spec.finish(onComplete);
+    return;
+  }
+
+  this.env.reporter.reportSpecStarting(this);
+
+  spec.env.currentSpec = spec;
+
+  spec.addBeforesAndAftersToQueue();
+
+  spec.queue.start(function () {
+    spec.finish(onComplete);
+  });
+};
+
+jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
+  var runner = this.env.currentRunner();
+  var i;
+
+  for (var suite = this.suite; suite; suite = suite.parentSuite) {
+    for (i = 0; i < suite.before_.length; i++) {
+      this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
+    }
+  }
+  for (i = 0; i < runner.before_.length; i++) {
+    this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
+  }
+  for (i = 0; i < this.afterCallbacks.length; i++) {
+    this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
+  }
+  for (suite = this.suite; suite; suite = suite.parentSuite) {
+    for (i = 0; i < suite.after_.length; i++) {
+      this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
+    }
+  }
+  for (i = 0; i < runner.after_.length; i++) {
+    this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
+  }
+};
+
+jasmine.Spec.prototype.explodes = function() {
+  throw 'explodes function should not have been called';
+};
+
+jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
+  if (obj == jasmine.undefined) {
+    throw "spyOn could not find an object to spy upon for " + methodName + "()";
+  }
+
+  if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
+    throw methodName + '() method does not exist';
+  }
+
+  if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
+    throw new Error(methodName + ' has already been spied upon');
+  }
+
+  var spyObj = jasmine.createSpy(methodName);
+
+  this.spies_.push(spyObj);
+  spyObj.baseObj = obj;
+  spyObj.methodName = methodName;
+  spyObj.originalValue = obj[methodName];
+
+  obj[methodName] = spyObj;
+
+  return spyObj;
+};
+
+jasmine.Spec.prototype.removeAllSpies = function() {
+  for (var i = 0; i < this.spies_.length; i++) {
+    var spy = this.spies_[i];
+    spy.baseObj[spy.methodName] = spy.originalValue;
+  }
+  this.spies_ = [];
+};
+
+/**
+ * Internal representation of a Jasmine suite.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {String} description
+ * @param {Function} specDefinitions
+ * @param {jasmine.Suite} parentSuite
+ */
+jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
+  var self = this;
+  self.id = env.nextSuiteId ? env.nextSuiteId() : null;
+  self.description = description;
+  self.queue = new jasmine.Queue(env);
+  self.parentSuite = parentSuite;
+  self.env = env;
+  self.before_ = [];
+  self.after_ = [];
+  self.children_ = [];
+  self.suites_ = [];
+  self.specs_ = [];
+};
+
+jasmine.Suite.prototype.getFullName = function() {
+  var fullName = this.description;
+  for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
+    fullName = parentSuite.description + ' ' + fullName;
+  }
+  return fullName;
+};
+
+jasmine.Suite.prototype.finish = function(onComplete) {
+  this.env.reporter.reportSuiteResults(this);
+  this.finished = true;
+  if (typeof(onComplete) == 'function') {
+    onComplete();
+  }
+};
+
+jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
+  beforeEachFunction.typeName = 'beforeEach';
+  this.before_.unshift(beforeEachFunction);
+};
+
+jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
+  afterEachFunction.typeName = 'afterEach';
+  this.after_.unshift(afterEachFunction);
+};
+
+jasmine.Suite.prototype.results = function() {
+  return this.queue.results();
+};
+
+jasmine.Suite.prototype.add = function(suiteOrSpec) {
+  this.children_.push(suiteOrSpec);
+  if (suiteOrSpec instanceof jasmine.Suite) {
+    this.suites_.push(suiteOrSpec);
+    this.env.currentRunner().addSuite(suiteOrSpec);
+  } else {
+    this.specs_.push(suiteOrSpec);
+  }
+  this.queue.add(suiteOrSpec);
+};
+
+jasmine.Suite.prototype.specs = function() {
+  return this.specs_;
+};
+
+jasmine.Suite.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.Suite.prototype.children = function() {
+  return this.children_;
+};
+
+jasmine.Suite.prototype.execute = function(onComplete) {
+  var self = this;
+  this.queue.start(function () {
+    self.finish(onComplete);
+  });
+};
+jasmine.WaitsBlock = function(env, timeout, spec) {
+  this.timeout = timeout;
+  jasmine.Block.call(this, env, null, spec);
+};
+
+jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
+
+jasmine.WaitsBlock.prototype.execute = function (onComplete) {
+  if (jasmine.VERBOSE) {
+    this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
+  }
+  this.env.setTimeout(function () {
+    onComplete();
+  }, this.timeout);
+};
+/**
+ * A block which waits for some condition to become true, with timeout.
+ *
+ * @constructor
+ * @extends jasmine.Block
+ * @param {jasmine.Env} env The Jasmine environment.
+ * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
+ * @param {Function} latchFunction A function which returns true when the desired condition has been met.
+ * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
+ * @param {jasmine.Spec} spec The Jasmine spec.
+ */
+jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
+  this.timeout = timeout || env.defaultTimeoutInterval;
+  this.latchFunction = latchFunction;
+  this.message = message;
+  this.totalTimeSpentWaitingForLatch = 0;
+  jasmine.Block.call(this, env, null, spec);
+};
+jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
+
+jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
+
+jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
+  if (jasmine.VERBOSE) {
+    this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
+  }
+  var latchFunctionResult;
+  try {
+    latchFunctionResult = this.latchFunction.apply(this.spec);
+  } catch (e) {
+    this.spec.fail(e);
+    onComplete();
+    return;
+  }
+
+  if (latchFunctionResult) {
+    onComplete();
+  } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
+    var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
+    this.spec.fail({
+      name: 'timeout',
+      message: message
+    });
+
+    this.abort = true;
+    onComplete();
+  } else {
+    this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
+    var self = this;
+    this.env.setTimeout(function() {
+      self.execute(onComplete);
+    }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
+  }
+};
+// Mock setTimeout, clearTimeout
+// Contributed by Pivotal Computer Systems, www.pivotalsf.com
+
+jasmine.FakeTimer = function() {
+  this.reset();
+
+  var self = this;
+  self.setTimeout = function(funcToCall, millis) {
+    self.timeoutsMade++;
+    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
+    return self.timeoutsMade;
+  };
+
+  self.setInterval = function(funcToCall, millis) {
+    self.timeoutsMade++;
+    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
+    return self.timeoutsMade;
+  };
+
+  self.clearTimeout = function(timeoutKey) {
+    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+  };
+
+  self.clearInterval = function(timeoutKey) {
+    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+  };
+
+};
+
+jasmine.FakeTimer.prototype.reset = function() {
+  this.timeoutsMade = 0;
+  this.scheduledFunctions = {};
+  this.nowMillis = 0;
+};
+
+jasmine.FakeTimer.prototype.tick = function(millis) {
+  var oldMillis = this.nowMillis;
+  var newMillis = oldMillis + millis;
+  this.runFunctionsWithinRange(oldMillis, newMillis);
+  this.nowMillis = newMillis;
+};
+
+jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
+  var scheduledFunc;
+  var funcsToRun = [];
+  for (var timeoutKey in this.scheduledFunctions) {
+    scheduledFunc = this.scheduledFunctions[timeoutKey];
+    if (scheduledFunc != jasmine.undefined &&
+        scheduledFunc.runAtMillis >= oldMillis &&
+        scheduledFunc.runAtMillis <= nowMillis) {
+      funcsToRun.push(scheduledFunc);
+      this.scheduledFunctions[timeoutKey] = jasmine.undefined;
+    }
+  }
+
+  if (funcsToRun.length > 0) {
+    funcsToRun.sort(function(a, b) {
+      return a.runAtMillis - b.runAtMillis;
+    });
+    for (var i = 0; i < funcsToRun.length; ++i) {
+      try {
+        var funcToRun = funcsToRun[i];
+        this.nowMillis = funcToRun.runAtMillis;
+        funcToRun.funcToCall();
+        if (funcToRun.recurring) {
+          this.scheduleFunction(funcToRun.timeoutKey,
+              funcToRun.funcToCall,
+              funcToRun.millis,
+              true);
+        }
+      } catch(e) {
+      }
+    }
+    this.runFunctionsWithinRange(oldMillis, nowMillis);
+  }
+};
+
+jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
+  this.scheduledFunctions[timeoutKey] = {
+    runAtMillis: this.nowMillis + millis,
+    funcToCall: funcToCall,
+    recurring: recurring,
+    timeoutKey: timeoutKey,
+    millis: millis
+  };
+};
+
+/**
+ * @namespace
+ */
+jasmine.Clock = {
+  defaultFakeTimer: new jasmine.FakeTimer(),
+
+  reset: function() {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.defaultFakeTimer.reset();
+  },
+
+  tick: function(millis) {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.defaultFakeTimer.tick(millis);
+  },
+
+  runFunctionsWithinRange: function(oldMillis, nowMillis) {
+    jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
+  },
+
+  scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
+    jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
+  },
+
+  useMock: function() {
+    if (!jasmine.Clock.isInstalled()) {
+      var spec = jasmine.getEnv().currentSpec;
+      spec.after(jasmine.Clock.uninstallMock);
+
+      jasmine.Clock.installMock();
+    }
+  },
+
+  installMock: function() {
+    jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
+  },
+
+  uninstallMock: function() {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.installed = jasmine.Clock.real;
+  },
+
+  real: {
+    setTimeout: jasmine.getGlobal().setTimeout,
+    clearTimeout: jasmine.getGlobal().clearTimeout,
+    setInterval: jasmine.getGlobal().setInterval,
+    clearInterval: jasmine.getGlobal().clearInterval
+  },
+
+  assertInstalled: function() {
+    if (!jasmine.Clock.isInstalled()) {
+      throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
+    }
+  },
+
+  isInstalled: function() {
+    return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
+  },
+
+  installed: null
+};
+jasmine.Clock.installed = jasmine.Clock.real;
+
+//else for IE support
+jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
+  if (jasmine.Clock.installed.setTimeout.apply) {
+    return jasmine.Clock.installed.setTimeout.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.setTimeout(funcToCall, millis);
+  }
+};
+
+jasmine.getGlobal().setInterval = function(funcToCall, millis) {
+  if (jasmine.Clock.installed.setInterval.apply) {
+    return jasmine.Clock.installed.setInterval.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.setInterval(funcToCall, millis);
+  }
+};
+
+jasmine.getGlobal().clearTimeout = function(timeoutKey) {
+  if (jasmine.Clock.installed.clearTimeout.apply) {
+    return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.clearTimeout(timeoutKey);
+  }
+};
+
+jasmine.getGlobal().clearInterval = function(timeoutKey) {
+  if (jasmine.Clock.installed.clearTimeout.apply) {
+    return jasmine.Clock.installed.clearInterval.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.clearInterval(timeoutKey);
+  }
+};
+
+jasmine.version_= {
+  "major": 1,
+  "minor": 1,
+  "build": 0,
+  "revision": 1308965645,
+  "release_candidate": 2
+};
diff --git a/Tom-Marble/deck.js/test/settings.js b/Tom-Marble/deck.js/test/settings.js
new file mode 100755 (executable)
index 0000000..7ba223d
--- /dev/null
@@ -0,0 +1,3 @@
+// SETTINGS, VARS, UTILITY FUNCTIONS
+jasmine.getFixtures().fixturesPath = 'fixtures';
+var defaults = $.deck.defaults;
diff --git a/Tom-Marble/deck.js/test/spec.core.js b/Tom-Marble/deck.js/test/spec.core.js
new file mode 100755 (executable)
index 0000000..cec7141
--- /dev/null
@@ -0,0 +1,527 @@
+// Go tests, go
+describe('Deck JS', function() {
+  describe('standard html structure', function() {
+    beforeEach(function() {
+      loadFixtures('standard.html');
+      if (Modernizr.history) {
+        history.replaceState({}, "", "#")
+      }
+      else {
+        window.location.hash = '#';
+      }
+    });
+
+    describe('init(options.selectors.slides)', function() {
+      it('should create slides', function() {
+        $.deck({
+          selectors: {
+            slides: '.slide3'
+          }
+        });
+        expect($.deck('getSlides').length).toEqual($('.slide3').length);
+      });
+    });
+
+    describe('init(selector)', function() {
+      it('should create slides', function() {
+        $.deck();
+        expect($.deck('getSlides').length).toEqual($('.slide').length);
+      });
+    });
+
+    describe('init([selectors])', function() {
+      it('should create slides', function() {
+        $.deck([
+          '.slide1',
+          '.slide2',
+          '.slide3',
+          '.slide4',
+          '.slide5'
+        ]);
+        expect($.deck('getSlides').length).toEqual($('.slide').length);
+      });
+    });
+
+    describe('navigation functions', function() {
+      beforeEach(function() {
+        $.deck();
+      });
+
+      describe('go(i)', function() {
+        it('should go to the i slide (0 based index)', function() {
+          $.deck('go', 3);
+          expect($.deck('getSlide')).toHaveClass('slide4');
+        });
+
+        it('should go to the slide with specified id', function() {
+          $.deck('go', 'custom-id');
+          expect($.deck('getSlide')).toHaveId('custom-id');
+        });
+
+        it('should go nowhere if i is out of bounds', function() {
+          $.deck('go', 5);
+          expect($.deck('getSlide')).toHaveClass('slide1');
+        });
+
+        it('should go nowhere if id does not exist', function() {
+          $.deck('go', 'i-dont-exist');
+          expect($.deck('getSlide')).toHaveClass('slide1');
+        });
+
+        describe('aria attribute updates', function() {
+          beforeEach(function() {
+            loadFixtures('nesteds.html');
+            $.deck();
+            $.deck('go', 5);
+          });
+
+          it('should set offscreen slides to hidden true', function() {
+            $([
+              '.toplevel.deck-before:not(.deck-child-current)',
+              '.toplevel.deck-previous:not(.deck-child-current)',
+              '.deck-next',
+              '.deck-after'
+            ].join(', ')).each(function() {
+              expect($(this)).toHaveAttr('aria-hidden', 'true');
+            });
+          });
+
+          it('should set onscreen slides to hidden false', function() {
+            $([
+              '.deck-child-current.slide',
+              '.deck-child-current .deck-before',
+              '.deck-child-current .deck-previous',
+              '.deck-current'
+            ].join(', ')).each(function() {
+              expect($(this)).toHaveAttr('aria-hidden', 'false');
+            });
+          });
+        });
+      });
+
+      describe('next()', function() {
+        it('should go to the next slide', function() {
+          $.deck('next');
+          expect($.deck('getSlide')).toHaveClass('slide2');
+        });
+
+        it('should go nowhere if on the last slide', function() {
+          $.deck('go', 4);
+          $.deck('next');
+          expect($.deck('getSlide')).toHaveClass('slide5');
+        });
+      });
+
+      describe('prev()', function() {
+        it('should go to the previous slide', function() {
+          $.deck('go', 2);
+          $.deck('prev');
+          expect($.deck('getSlide')).toHaveClass('slide2');
+        });
+
+        it('should go nowhere if on the first slide', function() {
+          $.deck('prev');
+          expect($.deck('getSlide')).toHaveClass('slide1');
+        });
+      });
+    });
+
+    describe('getters', function() {
+      beforeEach(function() {
+        $.deck();
+      });
+
+      describe('getSlide()', function() {
+        it('should get the current slide', function() {
+          expect($.deck('getSlide')).toHaveClass('slide1');
+          $.deck('go', 2);
+          expect($.deck('getSlide')).toHaveClass('slide3');
+        });
+      });
+
+      describe('getSlide(i)', function() {
+        it('should get slide number i (0 based index)', function() {
+          expect($.deck('getSlide', 1)).toHaveClass('slide2');
+          expect($.deck('getSlide', 3)).toHaveClass('slide4');
+        });
+
+        it('should return null if i is NaN', function() {
+          expect($.deck('getSlide', 'barfoo')).toBeNull();
+        });
+
+        it('should return null if i is out of bounds', function() {
+          expect($.deck('getSlide', 6)).toBeNull();
+        });
+      });
+
+      describe('getSlides()', function() {
+        it('should return an array of jQuery objects for each slide', function() {
+          var expectation = [];
+          var slides = $.deck('getSlides');
+          $('.slide').each(function() {
+            expectation.push($(this));
+          });
+          expect(slides).toEqual(expectation);
+        });
+      });
+
+      describe('getContainer()', function() {
+        it('should return a jQuery object with the container element(s)', function() {
+          expect($.deck('getContainer')).toBe(defaults.selectors.container);
+        });
+      });
+
+      describe('getOptions()', function() {
+        it('should return the current options object', function() {
+          expect($.deck('getOptions')).toEqual(defaults);
+        });
+      });
+
+      describe('getTopLevelSlides()', function() {
+        it('should return only root slides', function() {
+          loadFixtures('nesteds.html');
+          $.deck();
+          var expectation = [];
+          var topLevelSlides = $.deck('getTopLevelSlides');
+          $('.toplevel').each(function() {
+            expectation.push($(this));
+          });
+          expect(topLevelSlides).toEqual(expectation);
+        });
+      });
+
+      describe('getNestedSlides()', function() {
+        it('should return nested slides for current slide', function() {
+          loadFixtures('nesteds.html');
+          $.deck();
+          $.deck('go', 2);
+          var expectation = [];
+          var nestedSlides = $.deck('getNestedSlides');
+          $.deck('getSlide').find('.slide').each(function() {
+            expectation.push($(this));
+          });
+          expect(nestedSlides).toEqual(expectation);
+        });
+      });
+    });
+
+    describe('container states', function() {
+      beforeEach(function() {
+        $.deck();
+      });
+
+      it('should start at state 0', function() {
+        expect($(defaults.selectors.container)).toHaveClass(defaults.classes.onPrefix + '0');
+      });
+
+      it('should change states with the slide number', function() {
+        $.deck('next');
+        expect($(defaults.selectors.container)).toHaveClass(defaults.classes.onPrefix + '1');
+        $.deck('go', 3);
+        expect($(defaults.selectors.container)).toHaveClass(defaults.classes.onPrefix + '3');
+        $.deck('prev');
+        expect($(defaults.selectors.container)).toHaveClass(defaults.classes.onPrefix + '2');
+      });
+    });
+
+    describe('options object', function() {
+      var $d = $(document);
+
+      beforeEach(function() {
+        $.deck('.alt-slide', {
+          classes: {
+            after: 'alt-after',
+            before: 'alt-before',
+            current: 'alt-current',
+            onPrefix: 'alt-on-',
+            next: 'alt-next',
+            previous: 'alt-prev'
+          },
+
+          selectors: {
+            container: '.alt-container'
+          },
+
+          keys: {
+            next: 87,
+            previous: 69
+          }
+        });
+      });
+
+      describe('classes', function() {
+        it('should use the specified after class', function() {
+          expect($('.alt-slide3, .alt-slide4, .alt-slide5')).toHaveClass('alt-after');
+        });
+
+        it('should use the specified before class', function() {
+          $.deck('go', 4);
+          expect($('.alt-slide1, .alt-slide2, .alt-slide3')).toHaveClass('alt-before');
+        });
+
+        it('should use the specified container class', function() {
+          $.deck('go', 2);
+          expect($('.alt-container')).toHaveClass('alt-on-2');
+        });
+
+        it('should use the specified current class', function() {
+          expect($.deck('getSlide')).toHaveClass('alt-current');
+        });
+
+        it('should use the specified next class', function() {
+          expect($('.alt-slide2')).toHaveClass('alt-next');
+        });
+
+        it('should use the specified previous class', function() {
+          $.deck('next');
+          expect($('.alt-slide1')).toHaveClass('alt-prev');
+        });
+      });
+
+      describe('key bindings', function() {
+        var e;
+
+        beforeEach(function() {
+          e = jQuery.Event('keydown.deck');
+        });
+
+        it('should go to the next slide using the specified key', function() {
+          e.which = 87; // 'w'
+          $d.trigger(e);
+          expect($.deck('getSlide')).toHaveClass('alt-slide2');
+        });
+
+        it('should go to the previous slide using the specified key', function() {
+          $.deck('next');
+          e.which = 69; // 'e'
+          $d.trigger(e);
+          expect($.deck('getSlide')).toHaveClass('alt-slide1');
+        });
+
+        it('should not trigger events that originate within editable elements', function() {
+          var $outside = $('<input type="text" />').appendTo('body');
+          e = jQuery.Event('keydown');
+          e.which = 87;
+          $outside.trigger(e);
+          expect($.deck('getSlide')).toHaveClass('alt-slide1');
+          $outside.remove();
+        });
+      });
+    });
+
+    describe('events', function() {
+      var $d;
+
+      beforeEach(function() {
+        $d = $(document);
+      });
+
+      describe('deck.change', function() {
+        var index, oldIndex;
+
+        beforeEach(function() {
+          $.deck();
+          $.deck('go', 1);
+          $d.one('deck.change', function(event, from, to) {
+            index = to;
+            oldIndex = from;
+          });
+        });
+
+        it('should fire on go(i)', function() {
+          $.deck('go', 3);
+          expect(index).toEqual(3);
+        });
+
+        it('should fire on next()', function() {
+          $.deck('next');
+          expect(index).toEqual(2);
+        });
+
+        it('should fire on prev()', function() {
+          $.deck('prev');
+          expect(index).toEqual(0);
+        });
+
+        it('should pass parameters with from and to indices', function() {
+          $.deck('go', 3);
+          expect(index).toEqual(3);
+          expect(oldIndex).toEqual(1);
+        });
+
+        it('should not fire if default prevented in beforeChange', function() {
+          $d.bind('deck.beforeChange', false);
+          $.deck('go', 3);
+          expect($.deck('getSlide')).toEqual($.deck('getSlide', 1));
+          $d.unbind('deck.beforeChange', false);
+        });
+      });
+
+      describe('deck.init', function() {
+        it('should fire on deck initialization', function() {
+          $.deck();
+          expect($.deck('getSlides').length).toBeGreaterThan(0);
+        });
+      });
+
+      describe('deck.beforeInit', function() {
+        var beforeHit;
+
+        beforeEach(function() {
+          beforeHit = false;
+          $d.on('deck.beforeInit', function() {
+            beforeHit = true;
+          });
+        });
+
+        it('should fire on deck initialization', function() {
+          $.deck();
+          expect(beforeHit).toBeTruthy();
+        });
+
+        it('should have populated the slides array', function() {
+          var f = function() {
+            expect($.deck('getSlides').length).toEqual($('.slide').length);
+          };
+
+          $d.bind('deck.beforeInit', f);
+          $.deck();
+          $d.unbind('deck.beforeInit', f);
+        });
+
+        it('should prevent the init event if lockInit is called', function() {
+          var initHit = false;
+          var f = function(event) {
+            event.lockInit();
+          };
+          var g = function() {
+            initHit = true;
+          };
+
+          $d.bind('deck.beforeInit', f);
+          $d.bind('deck.init', g);
+          $.deck();
+          $d.unbind('deck.beforeInit', f);
+          $d.unbind('deck.init', g);
+          expect(initHit).toBeFalsy();
+        });
+
+        it('should warn if locked without release', function() {
+          var warned = false;
+          var f = function(event) {
+            event.lockInit();
+          };
+          var warn = console.warn;
+          window.console.warn = function() {
+            warned = true;
+          };
+
+          $d.bind('deck.beforeInit', f);
+          $.deck('.slide', {
+            initLockTimeout: 20
+          });
+          $d.unbind('deck.beforeInit', f);
+
+          waitsFor(function() {
+            return warned;
+          }, 'warning', 2000);
+
+          runs(function() {
+            window.console.warn = warn;
+          });
+        });
+
+        it('should fire init event once releaseInit is called', function() {
+          var f = function(event) {
+            event.lockInit();
+            window.setTimeout(function() {
+              event.releaseInit();
+            }, 20);
+          };
+
+          runs(function() {
+            $d.bind('deck.beforeInit', f);
+            $.deck();
+            $d.unbind('deck.beforeInit', f);
+          });
+
+          waitsFor(function() {
+            return $.deck('getSlides').length > 0;
+          }, 'lock to release', 2000);
+        });
+      });
+    });
+
+    describe('hash/id assignments', function() {
+      beforeEach(function() {
+        $.deck('.slide');
+      });
+
+      it('should assign ids to slides that do not have them', function() {
+        var slides = $.deck('getSlides');
+        $.each(slides, function(i, $e) {
+          expect($e.attr('id')).toBeTruthy();
+        });
+      });
+
+      it('should reassign ids on reinitialization', function() {
+        var $firstSlide = $.deck('getSlide', 0);
+        var firstID = $firstSlide.attr('id');
+
+        $firstSlide.before('<div class="slide"></div>');
+        $.deck('.slide');
+        expect($firstSlide).not.toHaveId(firstID);
+      });
+
+      it('should update container with a state class including the slide id', function() {
+        var $c = $.deck('getContainer');
+        var osp = defaults.classes.onPrefix;
+
+        expect($c).toHaveClass(osp + $.deck('getSlide', 0).attr('id'));
+        $.deck('next');
+        expect($c).toHaveClass(osp + $.deck('getSlide', 1).attr('id'));
+        $.deck('next');
+        expect($c).not.toHaveClass(osp + $.deck('getSlide', 1).attr('id'));
+        expect($c).toHaveClass(osp + $.deck('getSlide', 2).attr('id'));
+      });
+
+      it('should use existing ids if they exist', function() {
+        expect($('#custom-id')).toExist();
+      });
+
+      it('should update the URL on slide change (if supported)', function() {
+        if (Modernizr.history) {
+          $.deck('go', 3);
+          expect(window.location.hash).toEqual('#slide-3');
+        }
+      });
+
+      it('should deep link to slide on deck init', function() {
+        window.location.hash = "#slide-3";
+        $.deck('.slide');
+        waitsFor(function() {
+          return $.deck('getSlide').attr('id') === 'slide-3';
+        });
+      });
+
+      it('should follow internal hash links using hashchange (if supported)', function() {
+        window.location.hash = "#slide-3";
+        // Hashchange event doesn't fire right when the hash changes?
+        waitsFor(function() {
+          return $.deck('getSlide').attr('id') === 'slide-3';
+        }, 'hash to change to slide-3', 2000);
+      });
+    });
+  });
+
+  describe('empty deck', function() {
+    beforeEach(function() {
+      loadFixtures('empty.html');
+      $.deck();
+    });
+
+    describe('getSlide()', function() {
+      it('should not error on init', $.noop);
+    });
+  });
+});
diff --git a/Tom-Marble/deck.js/test/spec.goto.js b/Tom-Marble/deck.js/test/spec.goto.js
new file mode 100644 (file)
index 0000000..014f3fa
--- /dev/null
@@ -0,0 +1,154 @@
+describe('Deck JS Quick Go-To', function() {
+  var $d = $(document);
+
+  beforeEach(function() {
+    loadFixtures('standard.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide');
+  });
+
+  describe('showGoTo()', function() {
+    it('should show the go-to helper', function() {
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+      $.deck('showGoTo');
+      expect($(defaults.selectors.container)).toHaveClass(defaults.classes.goto);
+    });
+
+    it('should focus the go-to input', function() {
+      $.deck('showGoTo');
+      expect($(defaults.selectors.gotoInput)[0]).toEqual(document.activeElement);
+    });
+
+    it('should set aria-hidden to false', function() {
+      var $gotoForm = $(defaults.selectors.gotoForm);
+      $.deck('showGoTo');
+      expect($gotoForm).toHaveAttr('aria-hidden', 'false');
+    });
+  });
+
+  describe('hideGoTo()', function() {
+    beforeEach(function() {
+      $.deck('showGoTo');
+      $.deck('hideGoTo');
+    });
+
+    it('should hide the go-to helper', function() {
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+    });
+
+    it('should blur the go-to input', function() {
+      expect($(defaults.selectors.gotoInput)[0]).not.toEqual(document.activeElement);
+    });
+
+    it('should set aria-hidden to true', function() {
+      var $gotoForm = $(defaults.selectors.gotoForm);
+      $.deck('hideGoTo');
+      expect($gotoForm).toHaveAttr('aria-hidden', 'true');
+    });
+  });
+
+  describe('toggleGoTo()', function() {
+    it('should toggle the go-to helper on and off', function() {
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+      $.deck('toggleGoTo');
+      expect($(defaults.selectors.container)).toHaveClass(defaults.classes.goto);
+      $.deck('toggleGoTo');
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+    });
+  });
+
+  describe('Go-To submit', function() {
+    beforeEach(function() {
+      $.deck('showGoTo');
+    });
+
+    it('should hide the go-to helper', function() {
+      $(defaults.selectors.gotoInput).val('3');
+      $(defaults.selectors.gotoForm).submit();
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+    });
+
+    it('should go to the slide number entered', function() {
+      $(defaults.selectors.gotoInput).val('3');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toEqual($.deck('getSlide'), 2);
+    });
+
+    it('should go to the slide id entered', function() {
+      $(defaults.selectors.gotoInput).val('custom-id');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toEqual($.deck('getSlide'), 1);
+    });
+
+    it('should go nowhere if the number is negative', function() {
+      $(defaults.selectors.gotoInput).val('-2');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toEqual($.deck('getSlide'), 0);
+    });
+
+    it('should go nowhere if the number is greater than the number of slides', function() {
+      $(defaults.selectors.gotoInput).val('9');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toEqual($.deck('getSlide'), 0);
+    });
+
+    it('should go nowhere if the id does not exist', function() {
+      $(defaults.selectors.gotoInput).val('do-not-exist');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toEqual($.deck('getSlide'), 0);
+    });
+  });
+
+  describe('Datalist population', function() {
+    it('should fill in options with all the slide ids', function() {
+      var $dataOptions = $(defaults.selectors.gotoDatalist).find('option');
+      expect($dataOptions.length).toEqual(5);
+      expect($dataOptions.eq(0).attr('value')).toEqual('slide-0');
+      expect($dataOptions.eq(1).attr('value')).toEqual('custom-id');
+    });
+  });
+
+  describe('key bindings', function() {
+    var e;
+
+    beforeEach(function() {
+      e = jQuery.Event('keydown.deckgoto');
+    });
+
+    it('should toggle the go-to helper if the specified key is pressed', function() {
+      e.which = 71; // g
+      $d.trigger(e);
+      expect($(defaults.selectors.container)).toHaveClass(defaults.classes.goto);
+      $d.trigger(e);
+      expect($(defaults.selectors.container)).not.toHaveClass(defaults.classes.goto);
+    });
+  });
+
+  describe('countNested false', function() {
+    beforeEach(function() {
+      loadFixtures('nesteds.html');
+      $.deck('.slide', {
+        countNested: false
+      });
+      $.deck('showGoTo');
+    });
+
+    it('should ignore nested slides when given a slide number', function() {
+      $(defaults.selectors.gotoInput).val('4');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toHaveId('after');
+    });
+
+    it('should respect top side of new slide range', function() {
+      $.deck('go', 0);
+      $(defaults.selectors.gotoInput).val('6');
+      $(defaults.selectors.gotoForm).submit();
+      expect($.deck('getSlide')).toHaveId('slide-0');
+    });
+  });
+});
diff --git a/Tom-Marble/deck.js/test/spec.menu.js b/Tom-Marble/deck.js/test/spec.menu.js
new file mode 100644 (file)
index 0000000..3abca9f
--- /dev/null
@@ -0,0 +1,83 @@
+describe('Deck JS Menu', function() {
+  var $d = $(document);
+  var dsc = defaults.selectors.container;
+
+  beforeEach(function() {
+    loadFixtures('standard.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide');
+  });
+
+  describe('showMenu()', function() {
+    it('should show the menu', function() {
+      expect($(dsc)).not.toHaveClass(defaults.classes.menu);
+      $.deck('showMenu');
+      expect($(dsc)).toHaveClass(defaults.classes.menu);
+    });
+
+    it('should do nothing if menu is already showing', function() {
+      if (Modernizr.csstransforms) {
+        $.deck('showMenu');
+        $.deck('showMenu');
+        $.deck('hideMenu');
+        expect($('.slide').attr('style')).toBeFalsy();
+      }
+    });
+  });
+
+  describe('hideMenu()', function() {
+    it('should hide the menu', function() {
+      $.deck('showMenu');
+      $.deck('hideMenu');
+      expect($(dsc)).not.toHaveClass(defaults.classes.menu);
+    });
+  });
+
+  describe('toggleMenu()', function() {
+    it('should toggle menu on and off', function() {
+      expect($(dsc)).not.toHaveClass(defaults.classes.menu);
+      $.deck('toggleMenu');
+      expect($(dsc)).toHaveClass(defaults.classes.menu);
+      $.deck('toggleMenu');
+      expect($(dsc)).not.toHaveClass(defaults.classes.menu);
+    });
+  });
+
+  describe('key bindings', function() {
+    var e;
+
+    beforeEach(function() {
+      e = jQuery.Event('keydown.deckmenu');
+    });
+
+    it('should toggle the menu if the specified key is pressed', function() {
+      e.which = 77; // m
+      $d.trigger(e);
+      expect($(dsc)).toHaveClass(defaults.classes.menu);
+      $d.trigger(e);
+      expect($(dsc)).not.toHaveClass(defaults.classes.menu);
+    });
+  });
+
+  describe('touch bindings', function() {
+    var estart, eend;
+
+    beforeEach(function() {
+      estart = jQuery.Event('touchstart.deckmenu');
+      eend  = jQuery.Event('touchend.deckmenu');
+    });
+
+    it('should toggle the menu if the screen is touched', function() {
+      $.deck('getOptions').touch.doubletapWindow = Date.now() + 100000;
+      $.deck('getContainer').trigger(estart);
+      $.deck('getContainer').trigger(eend);
+      expect($(dsc)).toHaveClass(defaults.classes.menu);
+    });
+  });
+
+});
diff --git a/Tom-Marble/deck.js/test/spec.navigation.js b/Tom-Marble/deck.js/test/spec.navigation.js
new file mode 100644 (file)
index 0000000..db04794
--- /dev/null
@@ -0,0 +1,63 @@
+describe('Deck JS Navigation Buttons', function() {
+  beforeEach(function() {
+    loadFixtures('standard.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide');
+  });
+
+  it('should go to the next slide if next link is clicked', function() {
+    $(defaults.selectors.nextLink).click();
+    expect($.deck('getSlide')).toHaveClass('slide2');
+  });
+
+  it('should go to the previous slide if previous link is clicked', function() {
+    $.deck('go', 2);
+    $(defaults.selectors.previousLink).click();
+    expect($.deck('getSlide')).toHaveClass('slide2');
+  });
+
+  it('should add the disabled class to the previous link if on first slide', function() {
+    expect($(defaults.selectors.previousLink)).toHaveClass(defaults.classes.navDisabled);
+    $(defaults.selectors.nextLink).click();
+    expect($(defaults.selectors.previousLink)).not.toHaveClass(defaults.classes.navDisabled);
+    $(defaults.selectors.previousLink).click();
+    expect($(defaults.selectors.previousLink)).toHaveClass(defaults.classes.navDisabled);
+  });
+
+  it('should add aria-disabled to previous link if on first slide', function() {
+    $.deck('go', 0);
+    expect($(defaults.selectors.previousLink)).toHaveAttr('aria-disabled', 'true');
+  });
+
+  it('should add the disabled class to the next link if on last slide', function() {
+    expect($(defaults.selectors.nextLink)).not.toHaveClass(defaults.classes.navDisabled);
+    $.deck('go', $.deck('getSlides').length - 1);
+    expect($(defaults.selectors.nextLink)).toHaveClass(defaults.classes.navDisabled);
+  });
+
+  it('should add aria-disabled to next link if on last slide', function() {
+    $.deck('go', $.deck('getSlides').length - 1);
+    expect($(defaults.selectors.nextLink)).toHaveAttr('aria-disabled', 'true');
+  });
+
+  it('should not start disabled if deck initialized in the middle', function() {
+    $.deck('go', 2);
+    $.deck('.slide');
+    waitsFor(function() {
+      return !$(defaults.selectors.previousLink).hasClass(defaults.classes.navDisabled);
+    });
+  });
+
+  it('should update the links hrefs with real fragment ids', function() {
+    expect($(defaults.selectors.previousLink).attr('href')).toMatch(/#$/);
+    expect($(defaults.selectors.nextLink).attr('href')).toMatch('#custom-id');
+    $.deck('go', 2);
+    expect($(defaults.selectors.previousLink).attr('href')).toMatch('#custom-id');
+    expect($(defaults.selectors.nextLink).attr('href')).toMatch('#slide-3');
+  });
+});
diff --git a/Tom-Marble/deck.js/test/spec.scale.js b/Tom-Marble/deck.js/test/spec.scale.js
new file mode 100644 (file)
index 0000000..02be2d8
--- /dev/null
@@ -0,0 +1,57 @@
+describe('Deck JS Status Indicator', function() {
+  beforeEach(function() {
+    loadFixtures('standard.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide');
+  });
+
+  it('should start with scaling enabled', function() {
+    expect($.deck('getContainer')).toHaveClass(defaults.classes.scale);
+  });
+
+  describe('disableScale()', function() {
+    it('should remove the scale class from the container', function() {
+      $.deck('disableScale');
+      expect($.deck('getContainer')).not.toHaveClass(defaults.classes.scale);
+    });
+  });
+
+  describe('enableScale()', function() {
+    it('should add the scale class to the container', function() {
+      $.deck('disableScale');
+      $.deck('enableScale');
+      expect($.deck('getContainer')).toHaveClass(defaults.classes.scale);
+    });
+  });
+
+  describe('toggleScale()', function() {
+    it('should toggle between adding and removing the scale class', function() {
+      $.deck('toggleScale');
+      expect($.deck('getContainer')).not.toHaveClass(defaults.classes.scale);
+      $.deck('toggleScale');
+      expect($.deck('getContainer')).toHaveClass(defaults.classes.scale);
+    });
+  });
+
+  describe('key bindings', function() {
+    var e;
+    var $d = $(document);
+
+    beforeEach(function() {
+      e = jQuery.Event('keydown.deckscale');
+    });
+
+    it('should toggle scaling if the specified key is pressed', function() {
+      e.which = 83; // s
+      $d.trigger(e);
+      expect($.deck('getContainer')).not.toHaveClass(defaults.classes.scale);
+      $d.trigger(e);
+      expect($.deck('getContainer')).toHaveClass(defaults.classes.scale);
+    });
+  });
+});
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/test/spec.status.js b/Tom-Marble/deck.js/test/spec.status.js
new file mode 100644 (file)
index 0000000..5232f1c
--- /dev/null
@@ -0,0 +1,60 @@
+describe('Deck JS Status Indicator', function() {
+  beforeEach(function() {
+    loadFixtures('standard.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide');
+  });
+
+  it('should show the correct total number of slides', function() {
+    expect($(defaults.selectors.statusTotal)).toHaveText($.deck('getSlides').length);
+  });
+
+  it('should start at the right current slide', function() {
+    expect($(defaults.selectors.statusCurrent)).toHaveText(1);
+    $.deck('go', 2);
+    $.deck('.slide');
+    waitsFor(function() {
+      return $(defaults.selectors.statusCurrent).text() === '3';
+    });
+  });
+
+  it('should update to the correct number on slide change', function() {
+    $.deck('go', 2);
+    expect($(defaults.selectors.statusCurrent)).toHaveText('3');
+  });
+});
+
+describe('countNested false indicator', function() {
+  beforeEach(function() {
+    loadFixtures('nesteds.html');
+    if (Modernizr.history) {
+      history.replaceState({}, "", "#")
+    }
+    else {
+      window.location.hash = '#';
+    }
+    $.deck('.slide', {
+      countNested: false
+    });
+  });
+
+  it('should ignore nested slides in the total', function() {
+    expect($(defaults.selectors.statusTotal)).toHaveText('5');
+  });
+
+  it('should update to the root slide number when nested becomes active', function() {
+    $.deck('go', 10);
+    expect($(defaults.selectors.statusCurrent)).toHaveText('4');
+    $.deck('prev');
+    expect($(defaults.selectors.statusCurrent)).toHaveText('3');
+    $.deck('go', 3);
+    expect($(defaults.selectors.statusCurrent)).toHaveText('3');
+    $.deck('go', 1);
+    expect($(defaults.selectors.statusCurrent)).toHaveText('2');
+  });
+});
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/themes/style/_reset.scss b/Tom-Marble/deck.js/themes/style/_reset.scss
new file mode 100644 (file)
index 0000000..b158386
--- /dev/null
@@ -0,0 +1,300 @@
+/* Resets and base styles from HTML5 Boilerplate */
+div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+blockquote, q {
+  quotes:none;
+
+  &:before, &:after {
+    content:"";
+    content:none;
+  }
+}
+
+ins {
+  background-color:#ff9;
+  color:#000;
+  text-decoration:none;
+}
+
+mark {
+  background-color:#ff9;
+  color:#000;
+  font-style:italic;
+  font-weight:bold;
+}
+
+del {
+  text-decoration:line-through;
+}
+
+abbr[title], dfn[title] {
+  border-bottom:1px dotted;
+  cursor:help;
+}
+
+table {
+  border-collapse:collapse;
+  border-spacing:0;
+}
+
+hr {
+  display:block;
+  height:1px;
+  border:0;
+  border-top:1px solid #ccc;
+  margin:1em 0;
+  padding:0;
+}
+
+input, select {
+  vertical-align:middle;
+}
+
+select, input, textarea, button {
+  font:99% sans-serif;
+}
+
+pre, code, kbd, samp {
+  font-family:monospace, sans-serif;
+}
+
+a {
+  -webkit-tap-highlight-color:rgba(0,0,0,0);
+
+  &:hover, &:active {
+    outline:none;
+  }
+}
+
+ul, ol {
+  margin-left:2em;
+  vertical-align:top;
+}
+
+ol {
+  list-style-type:decimal;
+}
+
+nav {
+  ul, li {
+    margin:0;
+    list-style:none;
+    list-style-image:none;
+  }
+}
+
+small {
+  font-size:85%;
+}
+
+strong, th {
+  font-weight:bold;
+}
+
+td {
+  vertical-align:top;
+}
+
+sub, sup {
+  font-size:75%;
+  line-height:0;
+  position:relative;
+}
+
+sup {
+  top:-0.5em;
+}
+
+sub { bottom: -0.25em; }
+
+textarea {
+  overflow:auto;
+}
+
+input[type="radio"] {
+  vertical-align:text-bottom;
+}
+
+input[type="checkbox"] {
+  vertical-align:bottom;
+}
+
+label,
+input[type="button"],
+input[type="submit"],
+input[type="image"],
+button {
+  cursor:pointer;
+}
+
+button, input, select, textarea {
+  margin: 0;
+}
+
+input, textarea {
+  &:invalid {
+    border-radius:1px;
+    -moz-box-shadow:0px 0px 5px red;
+    -webkit-box-shadow:0px 0px 5px red;
+    box-shadow: 0px 0px 5px red;
+
+    .no-boxshadow {
+      background-color: #f0dddd;
+    }
+  }
+}
+
+button {
+  width:auto;
+  overflow:visible;
+}
+
+select, input, textarea {
+  color: #444 ;
+}
+
+a {
+  color:#607890;
+
+  &:hover, &:focus {
+    color:#036;
+  }
+
+  &:link {
+    -webkit-tap-highlight-color: #fff;
+  }
+}
+/* End HTML5 Boilerplate adaptations */
+
+h1 {
+  font-size:4.5em;
+}
+
+h1, .vcenter {
+  font-weight:bold;
+  text-align:center;
+  padding-top:1em;
+  max-height:100%;
+
+  .csstransforms & {
+    padding:0 48px;
+    position:absolute;
+    left:0;
+    right:0;
+    top:50%;
+    -webkit-transform:translate(0, -50%);
+    -moz-transform:translate(0, -50%);
+    -ms-transform:translate(0, -50%);
+    -o-transform:translate(0, -50%);
+    transform:translate(0, -50%);
+  }
+}
+
+.vcenter h1 {
+  position:relative;
+  top:auto;
+  padding:0;
+  -webkit-transform:none;
+  -moz-transform:none;
+  -ms-transform:none;
+  -o-transform:none;
+  transform:none;
+}
+
+h2 {
+  font-size:2.25em;
+  font-weight:bold;
+  padding-top:.5em;
+  margin:0 0 .66666em 0;
+  border-bottom:3px solid #888;
+}
+
+h3 {
+  font-size:1.4375em;
+  font-weight:bold;
+  margin-bottom:.30435em;
+}
+
+h4 {
+  font-size:1.25em;
+  font-weight:bold;
+  margin-bottom:.25em;
+}
+
+h5 {
+  font-size:1.125em;
+  font-weight:bold;
+  margin-bottom:.2222em;
+}
+
+h6 {
+  font-size:1em;
+  font-weight:bold;
+}
+
+img, iframe, video {
+  display:block;
+  max-width:100%;
+}
+
+video, iframe, img {
+  display:block;
+  margin:0 auto;
+}
+
+p, blockquote, iframe, img, ul, ol, pre, video {
+  margin-bottom:1em;
+}
+
+pre {
+  white-space:pre;
+  white-space:pre-wrap;
+  word-wrap:break-word;
+  padding: 1em;
+  border:1px solid #888;
+}
+
+em {
+  font-style:italic;
+}
+
+li {
+  padding:.25em 0;
+  vertical-align:middle;
+
+  > ol, > ul {
+    margin-bottom:inherit;
+  }
+}
+
+.deck-container {
+  font-size:16px;
+  line-height:1.25;
+  color:#444;
+}
+
+.slide {
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width:100%;
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/themes/style/neon.css b/Tom-Marble/deck.js/themes/style/neon.css
new file mode 100644 (file)
index 0000000..3bd5c6e
--- /dev/null
@@ -0,0 +1,421 @@
+/* Resets and base styles from HTML5 Boilerplate */
+div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+blockquote, q {
+  quotes: none;
+}
+blockquote:before, blockquote:after, q:before, q:after {
+  content: "";
+  content: none;
+}
+
+ins {
+  background-color: #ff9;
+  color: #000;
+  text-decoration: none;
+}
+
+mark {
+  background-color: #ff9;
+  color: #000;
+  font-style: italic;
+  font-weight: bold;
+}
+
+del {
+  text-decoration: line-through;
+}
+
+abbr[title], dfn[title] {
+  border-bottom: 1px dotted;
+  cursor: help;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+hr {
+  display: block;
+  height: 1px;
+  border: 0;
+  border-top: 1px solid #ccc;
+  margin: 1em 0;
+  padding: 0;
+}
+
+input, select {
+  vertical-align: middle;
+}
+
+select, input, textarea, button {
+  font: 99% sans-serif;
+}
+
+pre, code, kbd, samp {
+  font-family: monospace, sans-serif;
+}
+
+a {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+a:hover, a:active {
+  outline: none;
+}
+
+ul, ol {
+  margin-left: 2em;
+  vertical-align: top;
+}
+
+ol {
+  list-style-type: decimal;
+}
+
+nav ul, nav li {
+  margin: 0;
+  list-style: none;
+  list-style-image: none;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong, th {
+  font-weight: bold;
+}
+
+td {
+  vertical-align: top;
+}
+
+sub, sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+textarea {
+  overflow: auto;
+}
+
+input[type="radio"] {
+  vertical-align: text-bottom;
+}
+
+input[type="checkbox"] {
+  vertical-align: bottom;
+}
+
+label,
+input[type="button"],
+input[type="submit"],
+input[type="image"],
+button {
+  cursor: pointer;
+}
+
+button, input, select, textarea {
+  margin: 0;
+}
+
+input:invalid, textarea:invalid {
+  border-radius: 1px;
+  -moz-box-shadow: 0px 0px 5px red;
+  -webkit-box-shadow: 0px 0px 5px red;
+  box-shadow: 0px 0px 5px red;
+}
+input:invalid .no-boxshadow, textarea:invalid .no-boxshadow {
+  background-color: #f0dddd;
+}
+
+button {
+  width: auto;
+  overflow: visible;
+}
+
+select, input, textarea {
+  color: #444444;
+}
+
+a {
+  color: #607890;
+}
+a:hover, a:focus {
+  color: #036;
+}
+a:link {
+  -webkit-tap-highlight-color: #fff;
+}
+
+/* End HTML5 Boilerplate adaptations */
+h1 {
+  font-size: 4.5em;
+}
+
+h1, .vcenter {
+  font-weight: bold;
+  text-align: center;
+  padding-top: 1em;
+  max-height: 100%;
+}
+.csstransforms h1, .csstransforms .vcenter {
+  padding: 0 48px;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 50%;
+  -webkit-transform: translate(0, -50%);
+  -moz-transform: translate(0, -50%);
+  -ms-transform: translate(0, -50%);
+  -o-transform: translate(0, -50%);
+  transform: translate(0, -50%);
+}
+
+.vcenter h1 {
+  position: relative;
+  top: auto;
+  padding: 0;
+  -webkit-transform: none;
+  -moz-transform: none;
+  -ms-transform: none;
+  -o-transform: none;
+  transform: none;
+}
+
+h2 {
+  font-size: 2.25em;
+  font-weight: bold;
+  padding-top: .5em;
+  margin: 0 0 .66666em 0;
+  border-bottom: 3px solid #888;
+}
+
+h3 {
+  font-size: 1.4375em;
+  font-weight: bold;
+  margin-bottom: .30435em;
+}
+
+h4 {
+  font-size: 1.25em;
+  font-weight: bold;
+  margin-bottom: .25em;
+}
+
+h5 {
+  font-size: 1.125em;
+  font-weight: bold;
+  margin-bottom: .2222em;
+}
+
+h6 {
+  font-size: 1em;
+  font-weight: bold;
+}
+
+img, iframe, video {
+  display: block;
+  max-width: 100%;
+}
+
+video, iframe, img {
+  display: block;
+  margin: 0 auto;
+}
+
+p, blockquote, iframe, img, ul, ol, pre, video {
+  margin-bottom: 1em;
+}
+
+pre {
+  white-space: pre;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  padding: 1em;
+  border: 1px solid #888;
+}
+
+em {
+  font-style: italic;
+}
+
+li {
+  padding: .25em 0;
+  vertical-align: middle;
+}
+li > ol, li > ul {
+  margin-bottom: inherit;
+}
+
+.deck-container {
+  font-size: 16px;
+  line-height: 1.25;
+  color: #444;
+}
+
+.slide {
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 100%;
+}
+
+h1 {
+  color: #0af;
+  font-weight: normal;
+  font-weight: 100;
+  text-shadow: 0 0 50px #0af, 0 0 3px #fff;
+}
+
+h2 {
+  color: #af0;
+  border-bottom-color: #ccc;
+  font-weight: normal;
+  font-weight: 100;
+  text-shadow: 0 0 15px #af0, 0 0 2px #fff;
+  border-bottom: 1px solid #333;
+}
+
+h3 {
+  color: #fff;
+  font-weight: normal;
+  font-weight: 100;
+  text-shadow: 0 0 10px #fff, 0 0 2px #fff;
+}
+
+pre {
+  border-color: #333;
+}
+pre code {
+  color: #fff;
+}
+
+code {
+  color: #f0a;
+}
+
+blockquote {
+  font-size: 2em;
+  padding: 1em 2em;
+  color: #fff;
+  border-left: 5px solid #fff;
+}
+blockquote p {
+  margin: 0;
+}
+blockquote cite {
+  font-size: .5em;
+  font-style: normal;
+  font-weight: normal;
+  font-weight: 100;
+  color: #aaa;
+  text-shadow: 0 0 15px #fff, 0 0 2px #fff;
+}
+
+::-moz-selection {
+  background: #a0f;
+}
+
+::selection {
+  background: #a0f;
+}
+
+a, a:hover, a:focus, a:active, a:visited {
+  color: #f0a;
+  text-decoration: none;
+}
+a:hover, a:focus {
+  text-decoration: underline;
+}
+
+.deck-container {
+  font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
+  font-size: 1.75em;
+  color: #aaa;
+  background: #000;
+}
+.deck-container > .slide {
+  padding: 0 48px;
+}
+
+.slide .deck-before, .slide .deck-previous {
+  opacity: 0.4;
+}
+.slide .deck-before:not(.deck-child-current) .deck-before, .slide .deck-before:not(.deck-child-current) .deck-previous, .slide .deck-previous:not(.deck-child-current) .deck-before, .slide .deck-previous:not(.deck-child-current) .deck-previous {
+  opacity: 1;
+}
+.slide .deck-child-current {
+  opacity: 1;
+}
+
+.deck-prev-link, .deck-next-link {
+  background: #f0a;
+  text-shadow: 0 0 3px #fff;
+}
+.deck-prev-link, .deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited {
+  color: #fff;
+}
+.deck-prev-link:hover, .deck-prev-link:focus, .deck-next-link:hover, .deck-next-link:focus {
+  text-decoration: none;
+  box-shadow: 0 0 20px #f0a, 0 0 5px #fff;
+}
+
+.deck-status {
+  font-size: 0.6666em;
+}
+
+.goto-form {
+  background: #000;
+  border: 1px solid #f0a;
+}
+.goto-form label {
+  color: #fff;
+}
+
+.deck-menu .slide {
+  background: #333;
+}
+.deck-menu .deck-current {
+  background: #444;
+}
+.boxshadow .deck-menu .deck-current {
+  background: #000;
+  box-shadow: 0 0 20px #f0a, 0 0 5px #fff;
+}
+.no-touch .deck-menu .slide:hover {
+  background: #444;
+}
+.no-touch.boxshadow .deck-menu .slide:hover {
+  background: #000;
+  box-shadow: 0 0 20px #f0a, 0 0 5px #fff;
+}
diff --git a/Tom-Marble/deck.js/themes/style/neon.scss b/Tom-Marble/deck.js/themes/style/neon.scss
new file mode 100644 (file)
index 0000000..1631950
--- /dev/null
@@ -0,0 +1,148 @@
+@import "reset";
+
+h1 {
+  color:#0af;
+  font-weight:normal;
+  font-weight:100;
+  text-shadow:0 0 50px #0af, 0 0 3px #fff;
+}
+
+h2 {
+  color:#af0;
+  border-bottom-color:#ccc;
+  font-weight:normal;
+  font-weight:100;
+  text-shadow:0 0 15px #af0, 0 0 2px #fff;
+  border-bottom:1px solid #333;
+}
+
+h3 {
+  color:#fff;
+  font-weight:normal;
+  font-weight:100;
+  text-shadow:0 0 10px #fff, 0 0 2px #fff;
+}
+
+pre {
+  border-color:#333;
+
+  code {
+    color:#fff;
+  }
+}
+
+code {
+  color:#f0a;
+}
+
+blockquote {
+  font-size:2em;
+  padding:1em 2em;
+  color:#fff;
+  border-left:5px solid #fff;
+
+  p {
+    margin:0;
+  }
+
+  cite {
+    font-size:.5em;
+    font-style:normal;
+    font-weight:normal;
+    font-weight:100;
+    color:#aaa;
+    text-shadow:0 0 15px #fff, 0 0 2px #fff;
+  }
+}
+
+::-moz-selection{ background:#a0f; }
+::selection { background:#a0f; }
+
+a {
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#f0a;
+    text-decoration:none;
+  }
+
+  &:hover, &:focus {
+    text-decoration:underline;
+  }
+}
+
+.deck-container {
+  font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
+  font-size:1.75em;
+  color:#aaa;
+  background:#000;
+
+  > .slide {
+    padding:0 48px;
+  }
+}
+
+.slide {
+  .deck-before, .deck-previous {
+    opacity:0.4;
+
+    &:not(.deck-child-current) {
+      .deck-before, .deck-previous {
+  opacity:1;
+      }
+    }
+  }
+
+  .deck-child-current {
+    opacity:1;
+  }
+}
+
+.deck-prev-link, .deck-next-link {
+  background:#f0a;
+  text-shadow:0 0 3px #fff;
+
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#fff;
+  }
+
+  &:hover, &:focus {
+    text-decoration:none;
+    box-shadow:0 0 20px #f0a, 0 0 5px #fff;
+  }
+}
+
+.deck-status {
+  font-size:0.6666em;
+}
+
+.goto-form {
+  background:#000;
+  border:1px solid #f0a;
+
+  label {
+    color:#fff;
+  }
+}
+
+.deck-menu {
+  .slide {
+    background:#333;
+  }
+
+  .deck-current {
+    background:#444;
+
+    .boxshadow & {
+      background:#000;
+      box-shadow:0 0 20px #f0a, 0 0 5px #fff;
+    }
+  }
+
+  .no-touch & .slide:hover {
+    background:#444;
+  }
+
+  .no-touch.boxshadow & .slide:hover {
+    background:#000;
+    box-shadow:0 0 20px #f0a, 0 0 5px #fff;
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/themes/style/swiss.css b/Tom-Marble/deck.js/themes/style/swiss.css
new file mode 100644 (file)
index 0000000..7cdfc31
--- /dev/null
@@ -0,0 +1,389 @@
+/* Resets and base styles from HTML5 Boilerplate */
+div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+blockquote, q {
+  quotes: none;
+}
+blockquote:before, blockquote:after, q:before, q:after {
+  content: "";
+  content: none;
+}
+
+ins {
+  background-color: #ff9;
+  color: #000;
+  text-decoration: none;
+}
+
+mark {
+  background-color: #ff9;
+  color: #000;
+  font-style: italic;
+  font-weight: bold;
+}
+
+del {
+  text-decoration: line-through;
+}
+
+abbr[title], dfn[title] {
+  border-bottom: 1px dotted;
+  cursor: help;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+hr {
+  display: block;
+  height: 1px;
+  border: 0;
+  border-top: 1px solid #ccc;
+  margin: 1em 0;
+  padding: 0;
+}
+
+input, select {
+  vertical-align: middle;
+}
+
+select, input, textarea, button {
+  font: 99% sans-serif;
+}
+
+pre, code, kbd, samp {
+  font-family: monospace, sans-serif;
+}
+
+a {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+a:hover, a:active {
+  outline: none;
+}
+
+ul, ol {
+  margin-left: 2em;
+  vertical-align: top;
+}
+
+ol {
+  list-style-type: decimal;
+}
+
+nav ul, nav li {
+  margin: 0;
+  list-style: none;
+  list-style-image: none;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong, th {
+  font-weight: bold;
+}
+
+td {
+  vertical-align: top;
+}
+
+sub, sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+textarea {
+  overflow: auto;
+}
+
+input[type="radio"] {
+  vertical-align: text-bottom;
+}
+
+input[type="checkbox"] {
+  vertical-align: bottom;
+}
+
+label,
+input[type="button"],
+input[type="submit"],
+input[type="image"],
+button {
+  cursor: pointer;
+}
+
+button, input, select, textarea {
+  margin: 0;
+}
+
+input:invalid, textarea:invalid {
+  border-radius: 1px;
+  -moz-box-shadow: 0px 0px 5px red;
+  -webkit-box-shadow: 0px 0px 5px red;
+  box-shadow: 0px 0px 5px red;
+}
+input:invalid .no-boxshadow, textarea:invalid .no-boxshadow {
+  background-color: #f0dddd;
+}
+
+button {
+  width: auto;
+  overflow: visible;
+}
+
+select, input, textarea {
+  color: #444444;
+}
+
+a {
+  color: #607890;
+}
+a:hover, a:focus {
+  color: #036;
+}
+a:link {
+  -webkit-tap-highlight-color: #fff;
+}
+
+/* End HTML5 Boilerplate adaptations */
+h1 {
+  font-size: 4.5em;
+}
+
+h1, .vcenter {
+  font-weight: bold;
+  text-align: center;
+  padding-top: 1em;
+  max-height: 100%;
+}
+.csstransforms h1, .csstransforms .vcenter {
+  padding: 0 48px;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 50%;
+  -webkit-transform: translate(0, -50%);
+  -moz-transform: translate(0, -50%);
+  -ms-transform: translate(0, -50%);
+  -o-transform: translate(0, -50%);
+  transform: translate(0, -50%);
+}
+
+.vcenter h1 {
+  position: relative;
+  top: auto;
+  padding: 0;
+  -webkit-transform: none;
+  -moz-transform: none;
+  -ms-transform: none;
+  -o-transform: none;
+  transform: none;
+}
+
+h2 {
+  font-size: 2.25em;
+  font-weight: bold;
+  padding-top: .5em;
+  margin: 0 0 .66666em 0;
+  border-bottom: 3px solid #888;
+}
+
+h3 {
+  font-size: 1.4375em;
+  font-weight: bold;
+  margin-bottom: .30435em;
+}
+
+h4 {
+  font-size: 1.25em;
+  font-weight: bold;
+  margin-bottom: .25em;
+}
+
+h5 {
+  font-size: 1.125em;
+  font-weight: bold;
+  margin-bottom: .2222em;
+}
+
+h6 {
+  font-size: 1em;
+  font-weight: bold;
+}
+
+img, iframe, video {
+  display: block;
+  max-width: 100%;
+}
+
+video, iframe, img {
+  display: block;
+  margin: 0 auto;
+}
+
+p, blockquote, iframe, img, ul, ol, pre, video {
+  margin-bottom: 1em;
+}
+
+pre {
+  white-space: pre;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  padding: 1em;
+  border: 1px solid #888;
+}
+
+em {
+  font-style: italic;
+}
+
+li {
+  padding: .25em 0;
+  vertical-align: middle;
+}
+li > ol, li > ul {
+  margin-bottom: inherit;
+}
+
+.deck-container {
+  font-size: 16px;
+  line-height: 1.25;
+  color: #444;
+}
+
+.slide {
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 100%;
+}
+
+h1 {
+  color: #000;
+}
+
+h2 {
+  color: #c00;
+  border-bottom-color: #ccc;
+}
+
+h3 {
+  color: #888;
+}
+
+pre {
+  border-color: #ccc;
+}
+
+code {
+  color: #888;
+}
+
+blockquote {
+  font-size: 2em;
+  font-style: italic;
+  padding: 1em 2em;
+  color: #000;
+  border-left: 5px solid #ccc;
+}
+blockquote p {
+  margin: 0;
+}
+blockquote cite {
+  font-size: .5em;
+  font-style: normal;
+  font-weight: bold;
+  color: #888;
+}
+
+::-moz-selection {
+  background: #c00;
+  color: #fff;
+}
+
+::selection {
+  background: #c00;
+  color: #fff;
+}
+
+a, a:hover, a:focus, a:active, a:visited {
+  color: #c00;
+  text-decoration: none;
+}
+a:hover, a:focus {
+  text-decoration: underline;
+}
+
+.deck-container {
+  font-family: "Helvetica Neue", sans-serif;
+  font-size: 1.75em;
+  background: #fff;
+}
+.deck-container > .slide {
+  padding: 0 48px;
+}
+
+.slide .deck-before, .slide .deck-previous {
+  opacity: 0.4;
+}
+.slide .deck-before:not(.deck-child-current) .deck-before, .slide .deck-before:not(.deck-child-current) .deck-previous, .slide .deck-previous:not(.deck-child-current) .deck-before, .slide .deck-previous:not(.deck-child-current) .deck-previous {
+  opacity: 1;
+}
+.slide .deck-child-current {
+  opacity: 1;
+}
+
+.deck-prev-link, .deck-next-link {
+  background: #ccc;
+  font-family: serif;
+}
+.deck-prev-link, .deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited {
+  color: #fff;
+}
+.deck-prev-link:hover, .deck-prev-link:focus, .deck-next-link:hover, .deck-next-link:focus {
+  background: #c00;
+  text-decoration: none;
+}
+
+.deck-status {
+  font-size: 0.6666em;
+}
+
+.deck-menu .slide {
+  background: #eee;
+}
+.deck-menu .deck-current, .no-touch .deck-menu .slide:hover {
+  background: #ddf;
+}
diff --git a/Tom-Marble/deck.js/themes/style/swiss.scss b/Tom-Marble/deck.js/themes/style/swiss.scss
new file mode 100644 (file)
index 0000000..781574e
--- /dev/null
@@ -0,0 +1,109 @@
+@import "reset";
+
+h1 {
+  color:#000;
+}
+
+h2 {
+  color:#c00;
+  border-bottom-color:#ccc;
+}
+
+h3 {
+  color:#888;
+}
+
+pre {
+  border-color:#ccc;
+}
+
+code {
+  color:#888;
+}
+
+blockquote {
+  font-size:2em;
+  font-style:italic;
+  padding:1em 2em;
+  color:#000;
+  border-left:5px solid #ccc;
+
+  p {
+    margin:0;
+  }
+
+  cite {
+    font-size:.5em;
+    font-style:normal;
+    font-weight:bold;
+    color:#888;
+  }
+}
+
+::-moz-selection{ background:#c00; color:#fff; }
+::selection { background:#c00; color:#fff; }
+
+a {
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#c00;
+    text-decoration:none;
+  }
+
+  &:hover, &:focus {
+    text-decoration:underline;
+  }
+}
+
+.deck-container {
+  font-family: "Helvetica Neue", sans-serif;
+  font-size:1.75em;
+  background:#fff;
+
+  > .slide {
+    padding:0 48px;
+  }
+}
+
+.slide {
+  .deck-before, .deck-previous {
+    opacity:0.4;
+
+    &:not(.deck-child-current) {
+      .deck-before, .deck-previous {
+        opacity:1;
+      }
+    }
+  }
+
+  .deck-child-current {
+    opacity:1;
+  }
+}
+
+.deck-prev-link, .deck-next-link {
+  background:#ccc;
+  font-family:serif;
+
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#fff;
+  }
+
+  &:hover, &:focus {
+    background:#c00;
+    text-decoration:none;
+  }
+}
+
+.deck-status {
+  font-size:0.6666em;
+}
+
+.deck-menu {
+  .slide {
+    background:#eee;
+  }
+
+  .deck-current, .no-touch & .slide:hover {
+    background:#ddf;
+  }
+}
diff --git a/Tom-Marble/deck.js/themes/style/web-2.0.css b/Tom-Marble/deck.js/themes/style/web-2.0.css
new file mode 100644 (file)
index 0000000..05f628c
--- /dev/null
@@ -0,0 +1,500 @@
+@charset "UTF-8";
+/* Resets and base styles from HTML5 Boilerplate */
+div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+blockquote, q {
+  quotes: none;
+}
+blockquote:before, blockquote:after, q:before, q:after {
+  content: "";
+  content: none;
+}
+
+ins {
+  background-color: #ff9;
+  color: #000;
+  text-decoration: none;
+}
+
+mark {
+  background-color: #ff9;
+  color: #000;
+  font-style: italic;
+  font-weight: bold;
+}
+
+del {
+  text-decoration: line-through;
+}
+
+abbr[title], dfn[title] {
+  border-bottom: 1px dotted;
+  cursor: help;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+hr {
+  display: block;
+  height: 1px;
+  border: 0;
+  border-top: 1px solid #ccc;
+  margin: 1em 0;
+  padding: 0;
+}
+
+input, select {
+  vertical-align: middle;
+}
+
+select, input, textarea, button {
+  font: 99% sans-serif;
+}
+
+pre, code, kbd, samp {
+  font-family: monospace, sans-serif;
+}
+
+a {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+a:hover, a:active {
+  outline: none;
+}
+
+ul, ol {
+  margin-left: 2em;
+  vertical-align: top;
+}
+
+ol {
+  list-style-type: decimal;
+}
+
+nav ul, nav li {
+  margin: 0;
+  list-style: none;
+  list-style-image: none;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong, th {
+  font-weight: bold;
+}
+
+td {
+  vertical-align: top;
+}
+
+sub, sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+textarea {
+  overflow: auto;
+}
+
+input[type="radio"] {
+  vertical-align: text-bottom;
+}
+
+input[type="checkbox"] {
+  vertical-align: bottom;
+}
+
+label,
+input[type="button"],
+input[type="submit"],
+input[type="image"],
+button {
+  cursor: pointer;
+}
+
+button, input, select, textarea {
+  margin: 0;
+}
+
+input:invalid, textarea:invalid {
+  border-radius: 1px;
+  -moz-box-shadow: 0px 0px 5px red;
+  -webkit-box-shadow: 0px 0px 5px red;
+  box-shadow: 0px 0px 5px red;
+}
+input:invalid .no-boxshadow, textarea:invalid .no-boxshadow {
+  background-color: #f0dddd;
+}
+
+button {
+  width: auto;
+  overflow: visible;
+}
+
+select, input, textarea {
+  color: #444444;
+}
+
+a {
+  color: #607890;
+}
+a:hover, a:focus {
+  color: #036;
+}
+a:link {
+  -webkit-tap-highlight-color: #fff;
+}
+
+/* End HTML5 Boilerplate adaptations */
+h1 {
+  font-size: 4.5em;
+}
+
+h1, .vcenter {
+  font-weight: bold;
+  text-align: center;
+  padding-top: 1em;
+  max-height: 100%;
+}
+.csstransforms h1, .csstransforms .vcenter {
+  padding: 0 48px;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 50%;
+  -webkit-transform: translate(0, -50%);
+  -moz-transform: translate(0, -50%);
+  -ms-transform: translate(0, -50%);
+  -o-transform: translate(0, -50%);
+  transform: translate(0, -50%);
+}
+
+.vcenter h1 {
+  position: relative;
+  top: auto;
+  padding: 0;
+  -webkit-transform: none;
+  -moz-transform: none;
+  -ms-transform: none;
+  -o-transform: none;
+  transform: none;
+}
+
+h2 {
+  font-size: 2.25em;
+  font-weight: bold;
+  padding-top: .5em;
+  margin: 0 0 .66666em 0;
+  border-bottom: 3px solid #888;
+}
+
+h3 {
+  font-size: 1.4375em;
+  font-weight: bold;
+  margin-bottom: .30435em;
+}
+
+h4 {
+  font-size: 1.25em;
+  font-weight: bold;
+  margin-bottom: .25em;
+}
+
+h5 {
+  font-size: 1.125em;
+  font-weight: bold;
+  margin-bottom: .2222em;
+}
+
+h6 {
+  font-size: 1em;
+  font-weight: bold;
+}
+
+img, iframe, video {
+  display: block;
+  max-width: 100%;
+}
+
+video, iframe, img {
+  display: block;
+  margin: 0 auto;
+}
+
+p, blockquote, iframe, img, ul, ol, pre, video {
+  margin-bottom: 1em;
+}
+
+pre {
+  white-space: pre;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  padding: 1em;
+  border: 1px solid #888;
+}
+
+em {
+  font-style: italic;
+}
+
+li {
+  padding: .25em 0;
+  vertical-align: middle;
+}
+li > ol, li > ul {
+  margin-bottom: inherit;
+}
+
+.deck-container {
+  font-size: 16px;
+  line-height: 1.25;
+  color: #444;
+}
+
+.slide {
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: "Hoefler Text", Constantia, Palatino, "Palatino Linotype", "Book Antiqua", Georgia, serif;
+}
+
+h1 {
+  color: #08455f;
+}
+
+h2 {
+  color: #0b7495;
+  border-bottom: 0;
+}
+.cssreflections h2 {
+  line-height: 1;
+  -webkit-box-reflect: below -0.5555em -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.3, transparent), color-stop(0.7, rgba(255, 255, 255, 0.1)), to(transparent));
+  -moz-box-reflect: below -0.5555em -moz-linear-gradient(top, transparent 0%, transparent 30%, rgba(255, 255, 255, 0.3) 100%);
+}
+
+h3 {
+  color: #000;
+}
+
+pre {
+  border-color: #cde;
+  background: #fff;
+  position: relative;
+  z-index: auto;
+  border-radius: 5px;
+  /* http://nicolasgallagher.com/css-drop-shadows-without-images/ */
+}
+.csstransforms.boxshadow pre > :first-child:before {
+  content: "";
+  position: absolute;
+  z-index: -1;
+  background: #fff;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.csstransforms.boxshadow pre:before, .csstransforms.boxshadow pre:after {
+  content: "";
+  position: absolute;
+  z-index: -2;
+  bottom: 15px;
+  width: 50%;
+  height: 20%;
+  max-width: 300px;
+  box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7);
+}
+.csstransforms.boxshadow pre:before {
+  left: 10px;
+  -webkit-transform: rotate(-3deg);
+  -ms-transform: rotate(-3deg);
+  transform: rotate(-3deg);
+}
+.csstransforms.boxshadow pre:after {
+  right: 10px;
+  -webkit-transform: rotate(3deg);
+  -ms-transform: rotate(3deg);
+  transform: rotate(3deg);
+}
+
+code {
+  color: #789;
+}
+
+blockquote {
+  font-family: "Hoefler Text", Constantia, Palatino, "Palatino Linotype", "Book Antiqua", Georgia, serif;
+  font-size: 2em;
+  padding: 1em 2em .5em 2em;
+  color: #000;
+  background: #fff;
+  position: relative;
+  border: 1px solid #cde;
+  z-index: auto;
+  border-radius: 5px;
+}
+.boxshadow blockquote > :first-child:before {
+  content: "";
+  position: absolute;
+  z-index: -1;
+  background: #fff;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.boxshadow blockquote:after {
+  content: "";
+  position: absolute;
+  z-index: -2;
+  top: 10px;
+  bottom: 10px;
+  left: 0;
+  right: 50%;
+  -moz-border-radius: 10px / 100px;
+  border-radius: 10px / 100px;
+  box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
+}
+blockquote p {
+  margin: 0;
+}
+blockquote cite {
+  font-size: .5em;
+  font-style: normal;
+  font-weight: bold;
+  color: #888;
+}
+blockquote:before {
+  content: "“";
+  position: absolute;
+  top: 0;
+  left: 0;
+  font-size: 5em;
+  line-height: 1;
+  color: #ccf0f0;
+  z-index: 1;
+}
+
+::-moz-selection {
+  background: #08455f;
+  color: #fff;
+}
+
+::selection {
+  background: #08455f;
+  color: #fff;
+}
+
+a, a:hover, a:focus, a:active, a:visited {
+  color: #599;
+  text-decoration: none;
+}
+a:hover, a:focus {
+  text-decoration: underline;
+}
+
+.deck-container {
+  font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
+  font-size: 1.75em;
+  background: #f4fafe;
+  /* Old browsers */
+  background: -moz-linear-gradient(top, #f4fafe 0%, #ccf0f0 100%);
+  /* FF3.6+ */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4fafe), color-stop(100%, #ccf0f0));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #f4fafe 0%, #ccf0f0 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -o-linear-gradient(top, #f4fafe 0%, #ccf0f0 100%);
+  /* Opera11.10+ */
+  background: -ms-linear-gradient(top, #f4fafe 0%, #ccf0f0 100%);
+  /* IE10+ */
+  background: linear-gradient(top, #f4fafe 0%, #ccf0f0 100%);
+  /* W3C */
+  background-attachment: fixed;
+  text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.5);
+}
+.deck-container > .slide {
+  padding: 0 48px;
+}
+
+.slide .deck-before, .slide .deck-previous {
+  opacity: 0.4;
+}
+.slide .deck-before:not(.deck-child-current) .deck-before, .slide .deck-before:not(.deck-child-current) .deck-previous, .slide .deck-previous:not(.deck-child-current) .deck-before, .slide .deck-previous:not(.deck-child-current) .deck-previous {
+  opacity: 1;
+}
+.slide .deck-child-current {
+  opacity: 1;
+}
+
+.deck-prev-link, .deck-next-link {
+  background: #fff;
+  opacity: 0.5;
+}
+.deck-prev-link, .deck-prev-link:hover, .deck-prev-link:focus, .deck-prev-link:active, .deck-prev-link:visited, .deck-next-link, .deck-next-link:hover, .deck-next-link:focus, .deck-next-link:active, .deck-next-link:visited {
+  color: #599;
+}
+.deck-prev-link:hover, .deck-prev-link:focus, .deck-next-link:hover, .deck-next-link:focus {
+  opacity: 1;
+  text-decoration: none;
+}
+
+.deck-status {
+  font-size: 0.6666em;
+}
+
+.deck-menu .slide {
+  background: transparent;
+  border-radius: 5px;
+}
+.rgba .deck-menu .slide {
+  background: rgba(0, 0, 0, 0.1);
+}
+.deck-menu .slide.deck-current, .rgba .deck-menu .slide.deck-current, .no-touch .deck-menu .slide:hover {
+  background: #fff;
+}
+
+.goto-form {
+  background: #fff;
+  border: 1px solid #cde;
+  border-radius: 5px;
+}
+.boxshadow .goto-form {
+  box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
+}
diff --git a/Tom-Marble/deck.js/themes/style/web-2.0.scss b/Tom-Marble/deck.js/themes/style/web-2.0.scss
new file mode 100644 (file)
index 0000000..aa9e9b0
--- /dev/null
@@ -0,0 +1,228 @@
+@mixin rotate($deg) {
+  -webkit-transform:rotate($deg);
+  -ms-transform:rotate($deg);
+  transform:rotate($deg);
+}
+
+@import "reset";
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: "Hoefler Text", Constantia, Palatino, "Palatino Linotype", "Book Antiqua", Georgia, serif;
+}
+
+h1 {
+  color:#08455f;
+}
+
+h2 {
+  color:#0b7495;
+  border-bottom:0;
+
+  .cssreflections & {
+    line-height:1;
+    -webkit-box-reflect:below -0.5555em -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.3, transparent), color-stop(0.7, rgba(255,255,255,.1)), to(transparent));
+    -moz-box-reflect:below -0.5555em -moz-linear-gradient(top, transparent 0%, transparent 30%, rgba(255,255,255,.3) 100%);
+  }
+}
+
+h3 {
+  color:#000;
+}
+
+pre {
+  border-color:#cde;
+  background:#fff;
+  position:relative;
+  z-index:auto;
+  border-radius:5px;
+
+  /* http://nicolasgallagher.com/css-drop-shadows-without-images/ */
+  .csstransforms.boxshadow & {
+    > :first-child:before {
+      content:"";
+      position:absolute;
+      z-index:-1;
+      background:#fff;
+      top:0;
+      bottom:0;
+      left:0;
+      right:0;
+    }
+
+    &:before, &:after {
+      content:"";
+      position:absolute;
+      z-index:-2;
+      bottom:15px;
+      width:50%;
+      height:20%;
+      max-width:300px;
+      box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);
+    }
+
+    &:before {
+      left:10px;
+      @include rotate(-3deg);
+    }
+
+    &:after {
+      right:10px;
+      @include rotate(3deg);
+    }
+  }
+}
+
+code {
+  color:#789;
+}
+
+blockquote {
+  font-family: "Hoefler Text", Constantia, Palatino, "Palatino Linotype", "Book Antiqua", Georgia, serif;
+  font-size:2em;
+  padding:1em 2em .5em 2em;
+  color:#000;
+  background:#fff;
+  position:relative;
+  border:1px solid #cde;
+  z-index:auto;
+  border-radius:5px;
+
+  .boxshadow & {
+    > :first-child:before {
+      content:"";
+      position:absolute;
+      z-index:-1;
+      background:#fff;
+      top:0;
+      bottom:0;
+      left:0;
+      right:0;
+    }
+
+    &:after {
+      content:"";
+      position:absolute;
+      z-index:-2;
+      top: 10px;
+      bottom: 10px;
+      left: 0;
+      right: 50%;
+      -moz-border-radius: 10px / 100px;
+      border-radius: 10px / 100px;
+      box-shadow:0 0 15px rgba(0,0,0,0.6);
+    }
+  }
+
+  p {
+    margin:0;
+  }
+
+  cite {
+    font-size:.5em;
+    font-style:normal;
+    font-weight:bold;
+    color:#888;
+  }
+
+  &:before {
+    content:"“";
+    position:absolute;
+    top:0;
+    left:0;
+    font-size:5em;
+    line-height:1;
+    color:#ccf0f0;
+    z-index:1;
+  }
+}
+
+::-moz-selection{ background:#08455f; color:#fff; }
+::selection { background:#08455f; color:#fff; }
+
+a {
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#599;
+    text-decoration:none;
+  }
+
+  &:hover, &:focus {
+    text-decoration:underline;
+  }
+}
+
+.deck-container {
+  font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
+  font-size:1.75em;
+  background: rgb(244,250,254); /* Old browsers */
+  background: -moz-linear-gradient(top, rgba(244,250,254,1) 0%, rgba(204,240,240,1) 100%); /* FF3.6+ */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(244,250,254,1)), color-stop(100%,rgba(204,240,240,1))); /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, rgba(244,250,254,1) 0%,rgba(204,240,240,1) 100%); /* Chrome10+,Safari5.1+ */
+  background: -o-linear-gradient(top, rgba(244,250,254,1) 0%,rgba(204,240,240,1) 100%); /* Opera11.10+ */
+  background: -ms-linear-gradient(top, rgba(244,250,254,1) 0%,rgba(204,240,240,1) 100%); /* IE10+ */
+  background: linear-gradient(top, rgba(244,250,254,1) 0%,rgba(204,240,240,1) 100%); /* W3C */
+  background-attachment: fixed;
+  text-shadow:1px 1px 1px rgba(255,255,255,.5);
+
+  > .slide {
+    padding:0 48px;
+  }
+}
+
+.slide {
+  .deck-before, .deck-previous {
+    opacity:0.4;
+
+    &:not(.deck-child-current) {
+      .deck-before, .deck-previous {
+        opacity:1;
+      }
+    }
+  }
+
+  .deck-child-current {
+    opacity:1;
+  }
+}
+
+.deck-prev-link, .deck-next-link {
+  background:#fff;
+  opacity:0.5;
+
+  &, &:hover, &:focus, &:active, &:visited {
+    color:#599;
+  }
+
+  &:hover, &:focus {
+    opacity:1;
+    text-decoration:none;
+  }
+}
+
+.deck-status {
+  font-size:0.6666em;
+}
+
+.deck-menu {
+  .slide {
+    background:transparent;
+    border-radius:5px;
+
+    .rgba & {
+      background:rgba(0,0,0,.1);
+    }
+
+    &.deck-current, .rgba &.deck-current, .no-touch &:hover {
+      background:#fff;
+    }
+  }
+}
+
+.goto-form {
+  background:#fff;
+  border:1px solid #cde;
+  border-radius:5px;
+
+  .boxshadow & {
+    box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/themes/transition/fade.css b/Tom-Marble/deck.js/themes/transition/fade.css
new file mode 100644 (file)
index 0000000..ad5338c
--- /dev/null
@@ -0,0 +1,35 @@
+.csstransitions.csstransforms .deck-container .slide {
+  -webkit-transition: opacity 500ms ease-in-out 0ms;
+  transition: opacity 500ms ease-in-out 0ms;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .slide {
+  position: relative;
+  left: 0;
+  top: 0;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-after {
+  opacity: 0;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-current {
+  opacity: 1;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-after {
+  opacity: 0;
+  pointer-events: none;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before .slide, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous .slide {
+  visibility: visible;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current {
+  opacity: 1;
+  visibility: visible;
+  pointer-events: auto;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current .deck-after {
+  visibility: hidden;
+}
diff --git a/Tom-Marble/deck.js/themes/transition/fade.scss b/Tom-Marble/deck.js/themes/transition/fade.scss
new file mode 100644 (file)
index 0000000..56fbd4c
--- /dev/null
@@ -0,0 +1,59 @@
+@mixin translate($x: 0, $y: 0, $z: 0) {
+  -webkit-transform:translate3d($x, $y, $z);
+  -ms-transform:translate($x, $y);
+  transform:translate3d($x, $y, $z);
+}
+
+@mixin transition($prop, $duration, $easing: ease-in-out, $delay: 0ms) {
+  -webkit-transition:$prop $duration $easing $delay;
+  transition:$prop $duration $easing $delay;
+}
+
+.csstransitions.csstransforms {
+  .deck-container .slide {
+    @include transition(opacity, 500ms);
+  }
+
+  .deck-container:not(.deck-menu) {
+    > .slide {
+      position:absolute;
+      top:0;
+      left:0;
+
+      .slide {
+        position:relative;
+        left:0;
+        top:0;
+      }
+
+      .deck-next, .deck-after {
+        opacity:0;
+      }
+
+      .deck-current {
+        opacity:1;
+      }
+    }
+
+    > .deck-previous, > .deck-before, > .deck-next, > .deck-after {
+      opacity:0;
+      pointer-events:none;
+    }
+
+    > .deck-before, > .deck-previous {
+      .slide {
+        visibility:visible;
+      }
+    }
+
+    > .deck-child-current {
+      opacity:1;
+      visibility:visible;
+      pointer-events:auto;
+
+      .deck-next, .deck-after {
+        visibility:hidden;
+      }
+    }
+  }
+}
diff --git a/Tom-Marble/deck.js/themes/transition/horizontal-slide.css b/Tom-Marble/deck.js/themes/transition/horizontal-slide.css
new file mode 100644 (file)
index 0000000..183f030
--- /dev/null
@@ -0,0 +1,53 @@
+.csstransitions.csstransforms {
+  overflow-x: hidden;
+}
+.csstransitions.csstransforms .deck-container > .slide {
+  -webkit-transition: -webkit-transform 500ms ease-in-out;
+  transition: transform 500ms ease-in-out;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .slide {
+  position: relative;
+  left: 0;
+  top: 0;
+  -webkit-transition: -webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out;
+  transition: transform 500ms ease-in-out, opacity 500ms ease-in-out;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-after {
+  visibility: visible;
+  -webkit-transform: translate3d(200%, 0, 0);
+  -ms-transform: translate(200%, 0);
+  transform: translate3d(200%, 0, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous {
+  -webkit-transform: translate3d(-200%, 0, 0);
+  -ms-transform: translate(-200%, 0);
+  transform: translate3d(-200%, 0, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before {
+  -webkit-transform: translate3d(-400%, 0, 0);
+  -ms-transform: translate(-400%, 0);
+  transform: translate3d(-400%, 0, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-next {
+  -webkit-transform: translate3d(200%, 0, 0);
+  -ms-transform: translate(200%, 0);
+  transform: translate3d(200%, 0, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-after {
+  -webkit-transform: translate3d(400%, 0, 0);
+  -ms-transform: translate(400%, 0);
+  transform: translate3d(400%, 0, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before .slide, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous .slide {
+  visibility: visible;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current {
+  -webkit-transform: none;
+  -ms-transform: none;
+  transform: none;
+}
diff --git a/Tom-Marble/deck.js/themes/transition/horizontal-slide.scss b/Tom-Marble/deck.js/themes/transition/horizontal-slide.scss
new file mode 100644 (file)
index 0000000..d24f8ed
--- /dev/null
@@ -0,0 +1,72 @@
+@mixin translate($x: 0, $y: 0, $z: 0) {
+  -webkit-transform:translate3d($x, $y, $z);
+  -ms-transform:translate($x, $y);
+  transform:translate3d($x, $y, $z);
+}
+
+@mixin transition($prop, $duration, $easing: ease-in-out, $delay: 0ms) {
+  -webkit-transition:$prop $duration $easing $delay;
+  transition:$prop $duration $easing $delay;
+}
+
+@mixin transform($val) {
+  -webkit-transform:$val;
+  -ms-transform:$val;
+  transform:$val;
+}
+
+.csstransitions.csstransforms {
+  overflow-x:hidden;
+
+  .deck-container > .slide {
+    -webkit-transition:-webkit-transform 500ms ease-in-out;
+    transition:transform 500ms ease-in-out;
+  }
+
+  .deck-container:not(.deck-menu) {
+    > .slide {
+      position:absolute;
+      top:0;
+      left:0;
+
+      .slide {
+        position:relative;
+        left:0;
+        top:0;
+        -webkit-transition:-webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out;
+        transition:transform 500ms ease-in-out, opacity 500ms ease-in-out;
+      }
+
+      .deck-next, .deck-after {
+        visibility:visible;
+        @include translate(200%);
+      }
+    }
+
+    > .deck-previous {
+      @include translate(-200%);
+    }
+
+    > .deck-before {
+      @include translate(-400%);
+    }
+
+    > .deck-next {
+      @include translate(200%);
+    }
+
+    > .deck-after {
+      @include translate(400%);
+    }
+
+    > .deck-before, > .deck-previous {
+      .slide {
+        visibility:visible;
+      }
+    }
+
+    > .deck-child-current {
+      @include transform(none);
+    }
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/deck.js/themes/transition/vertical-slide.css b/Tom-Marble/deck.js/themes/transition/vertical-slide.css
new file mode 100644 (file)
index 0000000..b8ec020
--- /dev/null
@@ -0,0 +1,67 @@
+.csstransitions.csstransforms .deck-container {
+  overflow-y: hidden;
+}
+.csstransitions.csstransforms .deck-container > .slide {
+  -webkit-transition: -webkit-transform 500ms ease-in-out;
+  transition: transform 500ms ease-in-out;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .slide {
+  position: relative;
+  left: 0;
+  top: 0;
+  -webkit-transition: -webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out;
+  transition: transform 500ms ease-in-out, opacity 500ms ease-in-out;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-after {
+  visibility: visible;
+  -webkit-transform: translate3d(0, 1600px, 0);
+  -ms-transform: translate(0, 1600px);
+  transform: translate3d(0, 1600px, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous {
+  -webkit-transform: translate3d(0, -200%, 0);
+  -ms-transform: translate(0, -200%);
+  transform: translate3d(0, -200%, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before {
+  -webkit-transform: translate3d(0, -400%, 0);
+  -ms-transform: translate(0, -400%);
+  transform: translate3d(0, -400%, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-next {
+  -webkit-transform: translate3d(0, 200%, 0);
+  -ms-transform: translate(0, 200%);
+  transform: translate3d(0, 200%, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-after {
+  -webkit-transform: translate3d(0, 400%, 0);
+  -ms-transform: translate(0, 400%);
+  transform: translate3d(0, 400%, 0);
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before .slide, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous .slide {
+  visibility: visible;
+}
+.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current {
+  -webkit-transform: none;
+  -ms-transform: none;
+  transform: none;
+}
+.csstransitions.csstransforms .deck-prev-link {
+  left: auto;
+  right: 8px;
+  top: 59px;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.csstransitions.csstransforms .deck-next-link {
+  top: 99px;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
diff --git a/Tom-Marble/deck.js/themes/transition/vertical-slide.scss b/Tom-Marble/deck.js/themes/transition/vertical-slide.scss
new file mode 100644 (file)
index 0000000..2187725
--- /dev/null
@@ -0,0 +1,92 @@
+@mixin translate($x: 0, $y: 0, $z: 0) {
+  -webkit-transform:translate3d($x, $y, $z);
+  -ms-transform:translate($x, $y);
+  transform:translate3d($x, $y, $z);
+}
+
+@mixin rotate($deg) {
+  -webkit-transform:rotate($deg);
+  -ms-transform:rotate($deg);
+  transform:rotate($deg);
+}
+
+@mixin transition($prop, $duration, $easing: ease-in-out, $delay: 0ms) {
+  -webkit-transition:$prop $duration $easing $delay;
+  transition:$prop $duration $easing $delay;
+}
+
+@mixin transform($val) {
+  -webkit-transform:$val;
+  -ms-transform:$val;
+  transform:$val;
+}
+
+.csstransitions.csstransforms {
+  .deck-container {
+    overflow-y:hidden;
+
+    > .slide {
+      -webkit-transition:-webkit-transform 500ms ease-in-out;
+      transition:transform 500ms ease-in-out;
+    }
+  }
+
+  .deck-container:not(.deck-menu) {
+    > .slide {
+      position:absolute;
+      top:0;
+      left:0;
+
+      .slide {
+        position:relative;
+        left:0;
+        top:0;
+        -webkit-transition:-webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out;
+        transition:transform 500ms ease-in-out, opacity 500ms ease-in-out;
+      }
+
+      .deck-next, .deck-after {
+        visibility:visible;
+        @include translate(0, 1600px);
+      }
+    }
+
+    > .deck-previous {
+      @include translate(0, -200%);
+    }
+
+    > .deck-before {
+      @include translate(0, -400%);
+    }
+
+    > .deck-next {
+      @include translate(0, 200%);
+    }
+
+    > .deck-after {
+      @include translate(0, 400%);
+    }
+
+    > .deck-before, > .deck-previous {
+      .slide {
+        visibility:visible;
+      }
+    }
+
+    > .deck-child-current {
+      @include transform(none);
+    }
+  }
+
+  .deck-prev-link {
+    left:auto;
+    right:8px;
+    top:59px;
+    @include rotate(90deg);
+  }
+
+  .deck-next-link {
+    top:99px;
+    @include rotate(90deg);
+  }
+}
\ No newline at end of file
diff --git a/Tom-Marble/images/CC-by-sa.png b/Tom-Marble/images/CC-by-sa.png
new file mode 100644 (file)
index 0000000..27ed63b
Binary files /dev/null and b/Tom-Marble/images/CC-by-sa.png differ
diff --git a/Tom-Marble/images/Dont-trust-your-apps.jpg b/Tom-Marble/images/Dont-trust-your-apps.jpg
new file mode 100644 (file)
index 0000000..032ad24
Binary files /dev/null and b/Tom-Marble/images/Dont-trust-your-apps.jpg differ
diff --git a/Tom-Marble/images/bitcoin.svg b/Tom-Marble/images/bitcoin.svg
new file mode 100644 (file)
index 0000000..7d852c8
--- /dev/null
@@ -0,0 +1,17 @@
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="190" height="40" version="1.1">
+  <g transform="translate(-289.60744,-341.50536)">
+    <g transform="matrix(0.61129216,0,0,0.61129216,170.80346,315.53734)">
+      <path d="m258.845 82.989c-4.274 17.143-21.637 27.576-38.782 23.301-17.138-4.274-27.571-21.638-23.295-38.78 4.272-17.145 21.635-27.579 38.775-23.305 17.144 4.274 27.576 21.64 23.302 38.784z" fill="#f7931a"/>
+      <path d="m241.91 70.689c0.637-4.258-2.605-6.547-7.038-8.074l1.438-5.768-3.511-0.875-1.4 5.616c-0.923-0.23-1.871-0.447-2.813-0.662l1.41-5.653-3.509-0.875-1.439 5.766c-0.764-0.174-1.514-0.346-2.242-0.527l0.004-0.018-4.842-1.209-0.934 3.75c0 0 2.605 0.597 2.55 0.634 1.422 0.355 1.679 1.296 1.636 2.042l-1.638 6.571c0.098 0.025 0.225 0.061 0.365 0.117-0.117-0.029-0.242-0.061-0.371-0.092l-2.296 9.205c-0.174 0.432-0.615 1.08-1.609 0.834 0.035 0.051-2.552-0.637-2.552-0.637l-1.743 4.019 4.569 1.139c0.85 0.213 1.683 0.436 2.503 0.646l-1.453 5.834 3.507 0.875 1.439-5.772c0.958 0.26 1.888 0.5 2.798 0.726l-1.434 5.745 3.511 0.875 1.453-5.823c5.987 1.133 10.489 0.676 12.384-4.739 1.527-4.36-0.076-6.875-3.226-8.515 2.294-0.529 4.022-2.038 4.483-5.155zm-8.022 11.249c-1.085 4.36-8.426 2.003-10.806 1.412l1.928-7.729c2.38 0.594 10.012 1.77 8.878 6.317zm1.086-11.312c-0.99 3.966-7.1 1.951-9.082 1.457l1.748-7.01c1.982 0.494 8.365 1.416 7.334 5.553z" fill="#fff"/>
+      <g fill="#4d4d4d">
+        <path d="m289.581 62.613c2.595 0 4.837 0.465 6.721 1.378 1.893 0.922 3.455 2.164 4.708 3.726 1.236 1.57 2.156 3.405 2.75 5.508 0.59 2.109 0.886 4.376 0.886 6.803 0 3.728-0.683 7.25-2.062 10.57-1.379 3.325-3.25 6.209-5.63 8.669-2.378 2.457-5.186 4.394-8.424 5.825-3.233 1.432-6.748 2.148-10.522 2.148-0.488 0-1.346-0.014-2.558-0.039-1.212-0.025-2.605-0.15-4.165-0.361-1.57-0.219-3.23-0.543-4.983-0.977-1.752-0.426-3.416-1.023-4.983-1.781l14.012-58.876 12.55-1.945-5.017 20.893c1.074-0.484 2.156-0.859 3.236-1.132 1.081-0.269 2.241-0.409 3.481-0.409zm-10.527 34.671c1.89 0 3.671-0.465 5.344-1.378 1.678-0.914 3.126-2.148 4.339-3.685 1.213-1.544 2.173-3.283 2.873-5.226 0.7-1.943 1.054-3.97 1.054-6.079 0-2.591-0.433-4.612-1.296-6.073-0.863-1.455-2.46-2.187-4.779-2.187-0.76 0-1.739 0.145-2.953 0.404-1.218 0.275-2.308 0.846-3.285 1.705l-5.342 22.188c0.322 0.057 0.607 0.111 0.85 0.162 0.238 0.055 0.501 0.094 0.763 0.121 0.277 0.031 0.594 0.047 0.977 0.047 0.383 0 0.862 0.001 1.455 0.001z"/>
+        <path d="M317.664 106.108H305.677L315.8 63.511h12.069l-10.205 42.597zm5.833-47.787c-1.673 0-3.19-0.498-4.536-1.496-1.357-0.992-2.029-2.519-2.029-4.577 0-1.132 0.23-2.194 0.686-3.196 0.463-1 1.068-1.861 1.826-2.593 0.757-0.726 1.634-1.306 2.63-1.743 1.002-0.43 2.068-0.645 3.204-0.645 1.672 0 3.181 0.498 4.532 1.496 1.346 1.003 2.023 2.53 2.023 4.577 0 1.136-0.229 2.202-0.689 3.202-0.457 1-1.062 1.861-1.82 2.593-0.751 0.727-1.636 1.305-2.63 1.738-1.003 0.437-2.065 0.644-3.197 0.644z"/>
+        <path d="m338.372 52.9 12.555-1.945-3.083 12.556h13.446l-2.428 9.878h-13.365l-3.56 14.9c-0.328 1.242-0.514 2.402-0.566 3.48-0.059 1.083 0.078 2.013 0.402 2.796 0.322 0.785 0.901 1.39 1.741 1.818 0.836 0.435 2.033 0.654 3.603 0.654 1.293 0 2.553-0.123 3.771-0.367 1.211-0.24 2.438-0.574 3.68-1.011l0.894 9.236c-1.62 0.594-3.374 1.105-5.264 1.535-1.893 0.436-4.134 0.646-6.724 0.646-3.724 0-6.611-0.553-8.668-1.654-2.054-1.109-3.506-2.624-4.375-4.542-0.857-1.911-1.24-4.114-1.133-6.596 0.111-2.488 0.486-5.103 1.133-7.857L338.372 52.9z"/>
+        <path d="m360.761 89.103c0-3.669 0.594-7.129 1.781-10.368 1.185-3.242 2.892-6.077 5.107-8.51 2.207-2.421 4.896-4.339 8.061-5.747 3.15-1.4 6.677-2.106 10.564-2.106 2.433 0 4.606 0.23 6.518 0.691 1.92 0.465 3.657 1.066 5.228 1.82l-4.134 9.4c-1.08-0.438-2.201-0.824-3.36-1.174-1.16-0.357-2.576-0.529-4.251-0.529-4.001 0-7.164 1.379-9.518 4.128-2.345 2.751-3.526 6.454-3.526 11.099 0 2.753 0.594 4.979 1.786 6.682 1.186 1.703 3.377 2.55 6.558 2.55 1.57 0 3.085-0.164 4.536-0.484 1.462-0.324 2.753-0.732 3.89-1.214l0.895 9.636c-1.516 0.588-3.188 1.119-5.022 1.584-1.838 0.449-4.026 0.682-6.563 0.682-3.349 0-6.184-0.49-8.503-1.455-2.32-0.98-4.237-2.281-5.747-3.929-1.518-1.652-2.608-3.581-3.282-5.795-0.674-2.212-1.018-4.536-1.018-6.961z"/>
+        <path d="m414.009 107.241c-2.861 0-5.346-0.436-7.454-1.299-2.102-0.863-3.843-2.074-5.22-3.644-1.379-1.562-2.411-3.413-3.118-5.546-0.707-2.132-1.047-4.493-1.047-7.08 0-3.245 0.521-6.489 1.574-9.724 1.048-3.242 2.603-6.155 4.661-8.744 2.042-2.593 4.561-4.713 7.527-6.366 2.963-1.642 6.371-2.468 10.199-2.468 2.809 0 5.281 0.437 7.418 1.3 2.127 0.861 3.879 2.082 5.264 3.644 1.37 1.57 2.411 3.413 3.111 5.549 0.705 2.128 1.053 4.495 1.053 7.084 0 3.235-0.514 6.479-1.534 9.724-1.021 3.229-2.536 6.149-4.536 8.744-1.996 2.589-4.492 4.708-7.49 6.354-2.994 1.646-6.466 2.472-10.408 2.472zM420 72.579c-1.777 0-3.348 0.516-4.693 1.535-1.35 1.031-2.484 2.327-3.398 3.89-0.924 1.57-1.609 3.282-2.072 5.143-0.459 1.865-0.684 3.628-0.684 5.303 0 2.703 0.436 4.808 1.293 6.323 0.869 1.507 2.43 2.265 4.699 2.265 1.783 0 3.346-0.512 4.699-1.542 1.342-1.023 2.477-2.32 3.398-3.886 0.918-1.562 1.609-3.279 2.072-5.143 0.453-1.859 0.684-3.632 0.684-5.304 0-2.696-0.434-4.806-1.299-6.319-0.864-1.507-2.432-2.265-4.699-2.265z"/>
+        <path d="m451.043 106.108h-11.997l10.123-42.597h12.075l-10.201 42.597zm5.824-47.787c-1.672 0-3.188-0.498-4.532-1.496-1.35-0.992-2.028-2.519-2.028-4.577 0-1.132 0.233-2.194 0.69-3.196 0.457-1 1.066-1.861 1.824-2.593 0.753-0.726 1.638-1.306 2.632-1.743 0.996-0.43 2.062-0.645 3.194-0.645 1.676 0 3.19 0.498 4.538 1.496 1.349 1.003 2.03 2.53 2.03 4.577 0 1.136-0.242 2.202-0.695 3.202-0.453 1-1.062 1.861-1.817 2.593-0.76 0.727-1.634 1.305-2.63 1.738-1.004 0.437-2.068 0.644-3.206 0.644z"/>
+        <path d="m469.878 65.452c0.91-0.266 1.926-0.586 3.031-0.934 1.109-0.348 2.348-0.672 3.732-0.964 1.369-0.301 2.914-0.545 4.613-0.734 1.699-0.193 3.635-0.287 5.786-0.287 6.322 0 10.68 1.841 13.086 5.512 2.404 3.671 2.82 8.695 1.26 15.063l-5.514 23h-12.066l5.344-22.516c0.326-1.406 0.582-2.765 0.771-4.093 0.191-1.316 0.18-2.476-0.043-3.48-0.213-0.992-0.715-1.804-1.494-2.433-0.791-0.619-1.986-0.93-3.607-0.93-1.563 0-3.153 0.168-4.776 0.492l-7.857 32.959h-12.071l9.805-40.655z"/>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/Tom-Marble/images/centralized.jpg b/Tom-Marble/images/centralized.jpg
new file mode 100644 (file)
index 0000000..d51bd26
Binary files /dev/null and b/Tom-Marble/images/centralized.jpg differ
diff --git a/Tom-Marble/images/copyleft-next.png b/Tom-Marble/images/copyleft-next.png
new file mode 100644 (file)
index 0000000..6964cb2
Binary files /dev/null and b/Tom-Marble/images/copyleft-next.png differ
diff --git a/Tom-Marble/images/cuddles-qa.jpg b/Tom-Marble/images/cuddles-qa.jpg
new file mode 100644 (file)
index 0000000..5930ac8
Binary files /dev/null and b/Tom-Marble/images/cuddles-qa.jpg differ
diff --git a/Tom-Marble/images/dogecoin.png b/Tom-Marble/images/dogecoin.png
new file mode 100644 (file)
index 0000000..4e9d384
Binary files /dev/null and b/Tom-Marble/images/dogecoin.png differ
diff --git a/Tom-Marble/images/ethereum.png b/Tom-Marble/images/ethereum.png
new file mode 100644 (file)
index 0000000..29c627e
Binary files /dev/null and b/Tom-Marble/images/ethereum.png differ
diff --git a/Tom-Marble/images/gplv3-127x51.png b/Tom-Marble/images/gplv3-127x51.png
new file mode 100644 (file)
index 0000000..3e9136e
Binary files /dev/null and b/Tom-Marble/images/gplv3-127x51.png differ
diff --git a/Tom-Marble/images/logo_hl_new.png b/Tom-Marble/images/logo_hl_new.png
new file mode 100644 (file)
index 0000000..30b3720
Binary files /dev/null and b/Tom-Marble/images/logo_hl_new.png differ
diff --git a/Tom-Marble/images/mall_logo1_medium-300x286.png b/Tom-Marble/images/mall_logo1_medium-300x286.png
new file mode 100644 (file)
index 0000000..18b57e1
Binary files /dev/null and b/Tom-Marble/images/mall_logo1_medium-300x286.png differ
diff --git a/Tom-Marble/images/nyt-p2p.jpg b/Tom-Marble/images/nyt-p2p.jpg
new file mode 100644 (file)
index 0000000..6ce10fd
Binary files /dev/null and b/Tom-Marble/images/nyt-p2p.jpg differ
diff --git a/Tom-Marble/images/reef-death.jpg b/Tom-Marble/images/reef-death.jpg
new file mode 100644 (file)
index 0000000..196f80c
Binary files /dev/null and b/Tom-Marble/images/reef-death.jpg differ
diff --git a/Tom-Marble/images/tm01.png b/Tom-Marble/images/tm01.png
new file mode 100644 (file)
index 0000000..939b671
Binary files /dev/null and b/Tom-Marble/images/tm01.png differ
diff --git a/Tom-Marble/images/tm02.png b/Tom-Marble/images/tm02.png
new file mode 100644 (file)
index 0000000..6442f5a
Binary files /dev/null and b/Tom-Marble/images/tm02.png differ
diff --git a/Tom-Marble/images/tm03.png b/Tom-Marble/images/tm03.png
new file mode 100644 (file)
index 0000000..19e7a4b
Binary files /dev/null and b/Tom-Marble/images/tm03.png differ
diff --git a/Tom-Marble/images/tm04.png b/Tom-Marble/images/tm04.png
new file mode 100644 (file)
index 0000000..9f84d8e
Binary files /dev/null and b/Tom-Marble/images/tm04.png differ
diff --git a/Tom-Marble/images/tm05.png b/Tom-Marble/images/tm05.png
new file mode 100644 (file)
index 0000000..fcb922e
Binary files /dev/null and b/Tom-Marble/images/tm05.png differ
diff --git a/Tom-Marble/images/tm06.png b/Tom-Marble/images/tm06.png
new file mode 100644 (file)
index 0000000..e4a3ed2
Binary files /dev/null and b/Tom-Marble/images/tm06.png differ
diff --git a/Tom-Marble/images/tm07.png b/Tom-Marble/images/tm07.png
new file mode 100644 (file)
index 0000000..560ac11
Binary files /dev/null and b/Tom-Marble/images/tm07.png differ
diff --git a/Tom-Marble/images/tm08.png b/Tom-Marble/images/tm08.png
new file mode 100644 (file)
index 0000000..0210ef5
Binary files /dev/null and b/Tom-Marble/images/tm08.png differ
diff --git a/Tom-Marble/images/tm09.png b/Tom-Marble/images/tm09.png
new file mode 100644 (file)
index 0000000..f25199b
Binary files /dev/null and b/Tom-Marble/images/tm09.png differ
diff --git a/Tom-Marble/images/tm10.png b/Tom-Marble/images/tm10.png
new file mode 100644 (file)
index 0000000..d37380f
Binary files /dev/null and b/Tom-Marble/images/tm10.png differ
diff --git a/Tom-Marble/images/tm11.png b/Tom-Marble/images/tm11.png
new file mode 100644 (file)
index 0000000..c6ee38f
Binary files /dev/null and b/Tom-Marble/images/tm11.png differ
diff --git a/Tom-Marble/images/tm12.png b/Tom-Marble/images/tm12.png
new file mode 100644 (file)
index 0000000..c224db9
Binary files /dev/null and b/Tom-Marble/images/tm12.png differ
diff --git a/Tom-Marble/images/tm13.png b/Tom-Marble/images/tm13.png
new file mode 100644 (file)
index 0000000..9ce4eeb
Binary files /dev/null and b/Tom-Marble/images/tm13.png differ
diff --git a/Tom-Marble/images/zcash-logo-gold.png b/Tom-Marble/images/zcash-logo-gold.png
new file mode 100644 (file)
index 0000000..7fc4204
Binary files /dev/null and b/Tom-Marble/images/zcash-logo-gold.png differ
diff --git a/Tom-Marble/src/my-deck.el b/Tom-Marble/src/my-deck.el
new file mode 100644 (file)
index 0000000..043ec69
--- /dev/null
@@ -0,0 +1,146 @@
+;; elisp for making slides with ox-deck
+;;
+;;
+
+;; NOTE the following customizations
+;;  '(org-deck-directories (list "/home/tmarble/src/github/imakewebthings/deck.js"))
+;;  '(org-deck-postamble "")
+;;  '(org-deck-styles
+;;    "
+;; #title-slide h1 {
+;;     position: static; padding: 0;
+;;     margin-top: 10%;
+;;     -webkit-transform: none;
+;;     -moz-transform: none;
+;;     -ms-transform: none;
+;;     -o-transform: none;
+;;     transform: none;
+;;     font-size: 2em;
+;; }
+;; #title-slide h2 {
+;;     text-align: center;
+;;     border:none;
+;;     padding: 0;
+;;     margin: 5em;
+;;     font-size: 1.2em;
+;; }
+;; .fullscreen {
+;;     position: absolute;
+;;     left: 0px;
+;;     top: 0px;
+;;     width: 100%;
+;;     height: auto;
+;; }
+;; .pad-right {
+;;     margin-right: 1em;
+;; }
+;; .pad-bottom {
+;;     margin-bottom: 3em;
+;;     background: white;
+;; }
+;; .z0 { z-index: 0; }
+;; .z10 { z-index: 10; }
+;; .z20 { z-index: 20; }
+;; table.myable {
+;;   background-color: #ffffff;
+;;   border-collapse: collapse;
+;;   border-width: 2px;
+;;   border-color: #ffcc00;
+;;   border-style: solid;
+;;   color: blue;
+;; }
+;; table.mytable td, table.mytable th {
+;;   border-width: 2px;
+;;   border-color: #ffcc00;
+;;   border-style: solid;
+;;   padding: 3px;
+;; }
+;; table.mytable thead {
+;;   background-color: #ffcc00;
+;; }
+;; table.quiettable, table.quiettable colgroup, table.quiettable tbody, table.quiettable > th, table.quiettable > tr {
+;;   border-style: none;
+;; }
+;; table.quiettable td {
+;;   border-style: none;
+;;   padding: 0 1em;
+;; }
+;; table.quiettable thead {
+;;   border-style: none;
+;; }
+
+;; ")
+;;  '(org-deck-theme "neon.css")
+;;  '(org-deck-title-slide-template "<h1>%t</h1>
+;; <h2>%a &lt;%e&gt;</h2>")
+;;  '(org-export-with-footnotes t)
+
+;; NOTE this mutates prop :(
+(defun text-prop-to-string (prop)
+  "Text property to string"
+  (let* ((start 0)
+         (end (length prop)))
+    (set-text-properties start end nil prop)
+    prop))
+
+(defun org-deck-export-tmarble-html ()
+  "Deck export"
+  (interactive)
+  (message "Starting deck export...")
+  (let* ((export-env (org-export-get-environment))
+         (title (text-prop-to-string (car (plist-get export-env ':title))))
+         (deck-html (concat (replace-regexp-in-string " " "-" title) ".html"))
+         (deck-export-buffer "*Org deck.js Export*")
+         export-dir
+         (find-export-dir
+          (dolist (bfile (mapcar (function buffer-file-name) (buffer-list)))
+            (when (and (not export-dir) bfile (string-suffix-p ".org" bfile))
+              (setq export-dir (file-name-directory bfile)))))
+         ;; assume we found export-dir
+         (export-path (concat export-dir deck-html))
+         ;; Grab all the footnotes
+         (footnotes0 (progn
+                      (goto-char
+                       (org-find-exact-headline-in-buffer "Footnotes" nil t))
+                      (text-prop-to-string (org-get-entry))))
+         (footnotes1 (replace-regexp-in-string
+                      "\\[\\(fn:[0-9]+\\)\\]"
+                      "<li id=\042\\1\042>"
+                      footnotes0))
+         (footnotes (progn
+                      (message footnotes1)
+                      (replace-regexp-in-string
+                       "\\(http[-A-Za-z0-9:/?&.=_]+\\)"
+                       "<a href=\"\\1\">\\1</a>"
+                       footnotes1))))
+
+    ;; Paste Footnotes into References as raw HTML
+    (goto-char (org-find-exact-headline-in-buffer "References" nil t))
+    ;; (org-forward-heading-same-level 1)
+    ;; (insert "\n")
+    ;; (previous-line)
+    ;; delete contents of heading
+    (org-cut-subtree)
+    (insert "* References\n")
+    (insert "Footnote references (press 's' for scrollbars)\n")
+    (insert "#+BEGIN_HTML\n<input type=\"button\" value=\"◁\" onclick=\"window.history.back()\"/>\n<ol>\n")
+    (insert footnotes)
+    (insert "</ol>\n#+END_HTML\n")
+    ;; export the html to deck-export-buffer
+    (org-deck-export-as-html)
+    ;; s/outline-container-sec/slide/g
+    (replace-regexp "outline-container-sec" "slide" nil (point-min) (point-max))
+    ;; find the last slide and rename it to references
+    (goto-char (point-max))
+    (search-backward "id=\"slide-")
+    (replace-regexp "slide-[0-9]+" "references")
+    ;; change all footnote anchors to #references
+    (goto-char (point-min))
+    (replace-regexp "_org_" "org")
+    (replace-regexp "#fn\.[0-9]+" "#references")
+    ;; write file
+    (write-file export-path) ;; changes buffer name...
+    (message (concat "Exported deck to " deck-html))
+    ;; (kill-buffer deck-export-buffer)
+    (kill-buffer (current-buffer))
+    ))