Browse files

Initial commit of TractionSVG

  • Loading branch information...
0 parents commit 5274144403de1f2d4b72f137f6b624084fdc70ba @Chouser committed Dec 29, 2011
Showing with 1,162 additions and 0 deletions.
  1. +230 −0 README.org
  2. +24 −0 example/config.xml
  3. +528 −0 example/example.svg
  4. +3 −0 example/lighttpd.conf
  5. +152 −0 example/traction-0.0.1.js
  6. +225 −0 src/traction.cljs
230 README.org
@@ -0,0 +1,230 @@
+* Why not slides?
+
+The primary goal of many of the talks I've given is to duplicate a
+mental structure from my mind into the minds of my listeners so that
+they can understand it well enough to make their own judgments and
+possibly make use of the ideas. Or perhaps this is secondary to the
+goal of getting out of paying to attend the conference, but how better
+to continue doing that than to consistently help the audience to
+learn?
+
+Often these mental structures are represented in my mind by visual or
+spatial relationships. In these cases my slide-based presentations
+tended to incorporate lots of diagrams so that my audience could see
+roughly how the ideas look to me. Often diagrams on different slides
+would duplicate substantial amounts of information from previously
+seen diagrams, in order to represent various things such as changes
+over time, added detail, or how a previous diagram fit into a more
+comprehensive idea.
+
+But although there were real relationships between the diagrams on
+different slides, I felt slide-based presentation tools used effects
+in a way that obscured these relationships. For example, slides often
+move off to the left to reveal the next slide, suggesting to the
+audience that the previous diagram somehow belongs over there. Other
+effects such as fades, sliding vertically, flipping over, etc. are
+rarely any more helpful.
+
+TractionSVG is my humble attempt to build something that allows me to
+illuminate rather than obscure these relationships. I can use it to
+show an audience an undetailed diagram, then zoom in to different
+parts and show more detail. Rather than duplicating parts of diagrams,
+I can add or change visual elements of a single diagram and therefore
+hopefully introduce less mental discontinuity in audience members.
+
+* Using a presentation
+
+Just point a supported browser at the presentation `.svg` file, and
+you should see the first step of the presentation. Speaker's notes
+will pop up in a separate window, so you may need to disable your
+popup blocker if you want to see them.
+
+To advance to the next step, do any of:
+- Press space
+- Press the right arrow
+- Click on the right-hand half of the presentation window
+- Click on the header for the next step in the speaker's notes window
+
+To zoom to the previous step, do any of:
+- Press the left arrow
+- Click on the left-hand half of the presentation window
+- Click on the header for the previous step in the speaker's notes
+ window
+
+You can also jump to any arbitrary step by clicking its header in the
+speaker's notes window.
+
+In Chrome on Linux you can press F11 to enter fullscreen mode. This
+is perfect for showing on a projector while keeping the speaker's
+notes on your laptop screen.
+
+** Supported browsers
+
+TractionSVG has been tested most thoroughly on Chrome and Safari for
+iPhone, but has been reported to work on Safari and Firefox as well.
+
+* How it works
+
+The browser loads the `.svg` file which contains a link to (or a copy
+of) the `traction.js` JavaScript file. This JavaScript finds the
+presentation config, either from inside the `.svg` or in a separate
+config file. It uses instructions in this config to adjust the SVG DOM
+in various minor ways, opens a speaker's notes window, and begins
+playing the presentation.
+
+** Parts of a presentation
+*** The `.svg` file
+
+The presentation's `.svg` file may contain everything required for the
+presentation, including images, the config and the contents of
+`traction.js`. Used this way, an entire presentation can be single
+file called an "uber-traction", usable directly from any supported
+browser. The file may minimally contain however just a link to
+`traction.js` and the SVG elements to be displayed.
+
+A presentation's config will refer to the XML `id` attributes of
+elements in the `.svg` file. Also, every SVG `rect` element whose XML
+`id` begins with `view-` will be hidden immediately when the browser
+loads the presentation. These view rects will be used to control
+pre-set areas the browser's view can be zoomed to.
+
+*** The config
+
+The config for a presentation is an XML fragment that may be put
+either inside the `.svg` file, which allows for building an
+uber-traction, or in separate file named `config.xml`.
+
+The separate `config.xml` file must be in the same directory as the
+`.svg` file [note: the specifics of how the `config.xml` file is found
+are likely to change]. This is ideal for presentation development as
+it allows you to make and save changes to the `config.xml` and `.svg`
+files from different tools (such as a text editor and inkscape,
+respectively) at the same time. However, some browsers will not allow
+SVG at a `file:` URL to load the separate `config.xml` file, so you
+may need to run a local web server to make both the `.svg` and
+`config.xml` available to the browser during development.
+
+If a `config.xml` file is found, it takes precedence over any config
+element that may be included in the `.svg`.
+
+*** The `traction.js` file
+
+The JavaScript is of course the heart of the TractionSVG system, but
+should not require any customization from one presentation to another.
+It is generated by the ClojureScript compiler from sources in this
+repo's `src` directory, but the resulting `tranction.js` is also
+checked in for convenient use without having to install or use the
+ClojureScript compiler. A presentation's `.svg` file simply needs to
+refer to, or have a copy of, the `traction.js` file.
+
+* Creating a presentation
+
+The recommended way to create a presentation is to use an SVG editor
+such as inkscape, an XML editor (vim or emacs works well), a lighttpd,
+and a supported web browser. Note that only a browser is needed for
+viewing a completed presentation.
+
+Let's say you want to create a presentation named 'mypres'. Start in
+the directory that contains this README. Then:
+
+```
+$ cp -a example ~/mypres
+$ cd ~/mypres
+$ mv example.svg mypres.svg
+$ lighttpd -D -f lighttpd.conf
+```
+
+Now point your web browser to `http://localhost:8080/mypres.svg` and
+you should see a friendly welcome message. Edit the `config.xml` and
+`mypres.svg` files at will, and reload the page in the browser to see
+your changes.
+
+** About the example
+
+SVG elements that are very small may not be rendered at all in some
+browsers, even when you zoom in. To compensate for this, the body of
+the graphic is very large -- much larger than a 8.5x11 page.
+
+View rectangles are in a separate inkscape layer, which makes them
+easy to hide interactively. They are also colored green to help them
+stand out from the background. TractionSVG ignores all this however,
+and only pays attention to the XML element ids. View rectangles are
+simply `rect` elements whose ids start with "view-".
+
+* Building an uber-traction for sharing your presentation
+
+You can share your presentation directory if you'd like, which might
+work especially well if you host it on a web site somewhere. However,
+if you'd like to be able to email your presentation or otherwise send
+it around without a properly configured web server involved, it may be
+best to pull all of your files into a single uber-traction
+presentation file.
+
+Currently this is a manual process, so you'll need to open your `.svg`
+file in an XML or text editor. It's a good idea to close your SVG
+editor before doing this so you don't accidentally have it overwrite
+textual changes you'll be making to the `.svg` file.
+
+** Moving config into the `.svg`
+
+Simply paste the contents of your `config.xml` file into your `.svg`
+file. Immediately inside the opening `<svg>` tag is a file place to
+put it. Note that if TractionSVG can find a `config.xml` in the same
+directory as your `.svg` file, that will take precedence over what you
+just pasted, so you may want to build your uber-traction file in a new
+file in a separate directory or something.
+
+Your `.svg` may now look something like this:
+```
+<svg ...>
+ <steps xmlns="http://chouser.n01se.net/traction/config">
+ <init>...</init>
+ <step>...</step>
+ ...
+ </steps>
+ <script xlink:href="traction-0.0.1.js" type="text/ecmascript">
+ <defs>...</defs>
+ ...
+</svg>
+```
+
+It may look different later if you load the `.svg` file in inkscape
+and save it back out. Inkspace may adjust where XML namespaces are
+declared and such, but this shouldn't cause any problems for TractionSVG.
+
+** Moving `.js` into the `.svg`
+
+The snippet above shows the script tag that is used to load
+the TractionSVG JavaScript. To include the contents of the JavaScript
+instead of just having a reference to it, replace that script tag with
+one like this:
+
+```
+ <script type="text/ecmascript"><![CDATA[
+ ...
+ ]]>
+ </script>
+```
+
+Then replace `...` with the contents of the `traction.js` file.
+
+* Possible improvements
+
+Here are some ideas to inspire you in your quest to find improvements
+you could contribute:
+
+- Add a way to link from the `.svg` to a specific config file (rather
+ than always using `config.xml` in the same directory)
+- Add view transforms besides zoom, such as rotate.
+- Add animation attributes besides opacity, such as position,
+ rotation, etc.
+- Provide a speakers-notes view within page (instead of only as popup)
+ for more pleasant viewing by individuals later.
+- Add in-browser presentation editor (start small -- allow fixing of
+ typos, then config tweaks, eventually allow editing of SVG and all
+ supported features)
+- Include an easy-to-start web server to support development (serving
+ of config file, and eventually saving of changes made in the
+ in-browser presentation editor)
+
+--Chouser, Dec 2011
24 example/config.xml
@@ -0,0 +1,24 @@
+<steps xmlns="http://chouser.n01se.net/traction/config">
+ <init>
+ <set duration="1000" />
+ <set i="welcome" opacity="0" />
+ <set i="dev-detail" opacity="0" />
+ <set i="share-detail" opacity="0" />
+ </init>
+ <step view="view-begin">
+ <set i="welcome" opacity="1" once="true"/>
+ <ul xmlns="http://www.w3.org/1999/xhtml">
+ <li>A friendly welcome message</li>
+ </ul>
+ </step>
+ <step view="view-dev">
+ <set i="dev-detail" opacity="1" />
+ <ul xmlns="http://www.w3.org/1999/xhtml">
+ <li>More speaker's notes here.</li>
+ </ul>
+ </step>
+ <step view="view-share">
+ <set i="share-detail" opacity="1" />
+ </step>
+ <step view="view-final"></step>
+</steps>
528 example/example.svg
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1021"
+ height="765"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="example.svg"
+ style="background: #000; overflow: hidden;">
+ <script
+ xlink:href="traction-0.0.1.js"
+ id="script5450"
+ type="text/ecmascript" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient7299">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop7301" />
+ <stop
+ id="stop7307"
+ offset="0.8592189"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop7303" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient7305"
+ cx="38742.852"
+ cy="27696.311"
+ fx="38742.852"
+ fy="27696.311"
+ r="18800"
+ gradientTransform="matrix(0.09348597,-0.73647173,1.0788305,0.15204506,-90451.358,8942.3413)"
+ gradientUnits="userSpaceOnUse" />
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="fill:#ffffff;overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3880"
+ style="font-size:12px;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send-2"
+ style="fill:#ffffff;overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3880-8"
+ style="font-size:12px;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send-8"
+ style="fill:#ffffff;overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3880-6"
+ style="font-size:12px;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6111"
+ style="fill:#ffffff;overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6113"
+ style="font-size:12px;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#000000"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.01"
+ inkscape:cx="-25952.489"
+ inkscape:cy="22901.045"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ width="1024px"
+ inkscape:window-width="1280"
+ inkscape:window-height="776"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:description />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="chart"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-284.36218)"
+ style="display:inline">
+ <g
+ id="dev-detail"
+ inkscape:label="#g3220">
+ <g
+ inkscape:label="#g6292"
+ transform="matrix(0.40143211,0,0,0.40143211,-29911.644,-13029.607)"
+ id="ds-vector">
+ <g
+ id="g6306">
+ <g
+ transform="matrix(1.870471,0,0,1.3480374,16031.336,13139.925)"
+ id="g6270">
+ <rect
+ style="fill:none;stroke:#ffffff;stroke-width:120.46611023;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline;overflow:hidden"
+ id="rect5898-4"
+ width="6123.6592"
+ height="4745.9917"
+ x="-23349.98"
+ y="-37631.66"
+ ry="237.13931"
+ rx="170.90491" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:60.68051147;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;display:inline;overflow:hidden"
+ d="m -23165.37,-38619.628 5752.114,0 c 116.851,0 210.922,93.781 210.922,210.271 l 0,998.969 c 0,-117.351 -94.071,-249.104 -210.922,-249.104 l -5752.114,0 c -116.851,0 -210.921,114.705 -210.921,236.604 l 0,-986.469 c 0,-116.49 94.07,-210.271 210.921,-210.271 z"
+ id="rect6252"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:998.16912842px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-21887.783"
+ y="-37924.801"
+ id="text6254"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="-21887.783"
+ y="-37924.801"
+ style="font-size:995.97320557px;fill:#000000;fill-opacity:1"
+ id="tspan6258">your-presentation.svg</tspan></text>
+ </g>
+ </g>
+ <rect
+ ry="122.05883"
+ rx="0"
+ y="-27854.916"
+ x="-36480.039"
+ height="152.57353"
+ width="137.31618"
+ id="rect6048"
+ style="fill:#000000;stroke:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-40547.305"
+ y="-26603.182"
+ id="text5790-5-5"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6"
+ sodipodi:role="line"
+ x="-40547.305"
+ y="-26603.182">view rectangles</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-40547.305"
+ y="-25971.383"
+ id="text5790-5-5-1"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6-1"
+ sodipodi:role="line"
+ x="-40547.305"
+ y="-25971.383">visible elements</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-35249.855"
+ y="-27656.871"
+ id="text5790-5-4"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-4"
+ sodipodi:role="line"
+ x="-35249.855"
+ y="-27656.871">traction.js</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3350"
+ d="m -39287.06,-27779.515 3747.744,5.416"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:91.74368286;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Send);display:inline;overflow:hidden" />
+ <rect
+ ry="122.05883"
+ rx="0"
+ y="-27376.215"
+ x="-36478.129"
+ height="152.57353"
+ width="137.31618"
+ id="rect6048-3"
+ style="fill:#000000;stroke:none;display:inline;overflow:hidden" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:91.74368286;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Send);display:inline;overflow:hidden"
+ d="m -39287.06,-27304.818 c 0,0 3021.648,3.599 3482.184,3.599 873.386,0 -537.661,1603.015 366.241,1603.015 764.851,0 1318.253,16.082 1318.253,16.082"
+ id="path5927"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <g
+ inkscape:label="#g6292"
+ transform="matrix(0.40143211,0,0,0.40143211,-22703.377,-10426.767)"
+ id="ds-vector-1"
+ style="display:inline;overflow:hidden">
+ <g
+ id="g6306-7">
+ <g
+ transform="matrix(1.870471,0,0,1.3480374,16031.336,13139.925)"
+ id="g6270-4">
+ <rect
+ style="fill:none;stroke:#ffffff;stroke-width:120.46611023;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline;overflow:hidden"
+ id="rect5898-4-3"
+ width="6123.6592"
+ height="4745.9917"
+ x="-23349.98"
+ y="-37631.66"
+ ry="237.13931"
+ rx="170.90491" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:60.68051147;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;display:inline;overflow:hidden"
+ d="m -23165.37,-38619.628 5752.114,0 c 116.851,0 210.922,93.781 210.922,210.271 l 0,998.969 c 0,-117.351 -94.071,-249.104 -210.922,-249.104 l -5752.114,0 c -116.851,0 -210.921,114.705 -210.921,236.604 l 0,-986.469 c 0,-116.49 94.07,-210.271 210.921,-210.271 z"
+ id="rect6252-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:998.16912842px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-21897.51"
+ y="-37924.801"
+ id="text6254-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="-21897.51"
+ y="-37924.801"
+ style="font-size:995.97320557px;fill:#000000;fill-opacity:1"
+ id="tspan6258-6">config.xml</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-38825.574"
+ y="-31721.949"
+ id="text5790-5-4-9"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-4-4"
+ sodipodi:role="line"
+ x="-38825.574"
+ y="-31721.949">traction.cljs</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3350-8"
+ d="m -37602.038,-31523.913 3021.599,3311.093"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:91.74368286;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Send);display:inline;overflow:hidden" />
+ <text
+ transform="matrix(0.67703336,0.73595232,-0.73595232,0.67703336,0,0)"
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-47899.172"
+ y="6171.5317"
+ id="text5790-5-4-9-8"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-4-4-8"
+ sodipodi:role="line"
+ x="-47899.172"
+ y="6171.5317">CLJS compiler</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:448.89334106px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-33484.238"
+ y="-24888.113"
+ id="text5790-5-5-9"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6-4"
+ sodipodi:role="line"
+ x="-33484.238"
+ y="-24888.113">initial state</tspan><tspan
+ id="tspan6091"
+ sodipodi:role="line"
+ x="-33484.238"
+ y="-24326.996">step 1</tspan><tspan
+ id="tspan6095"
+ sodipodi:role="line"
+ x="-33484.238"
+ y="-23765.881">step 2</tspan><tspan
+ id="tspan6097"
+ sodipodi:role="line"
+ x="-33484.238"
+ y="-23204.764">...</tspan></text>
+ </g>
+ <g
+ id="share-detail"
+ transform="translate(1203.2838,0)"
+ inkscape:label="#g3203">
+ <g
+ inkscape:label="#g6292"
+ transform="matrix(0.44484699,0,0,0.44484699,-8858.666,-12164.441)"
+ id="ds-vector-0"
+ style="display:inline;overflow:hidden">
+ <g
+ id="g6306-4">
+ <g
+ transform="matrix(1.870471,0,0,1.3480374,16031.336,13139.925)"
+ id="g6270-6">
+ <rect
+ style="fill:none;stroke:#ffffff;stroke-width:120.46611023;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline;overflow:hidden"
+ id="rect5898-4-7"
+ width="8767.4014"
+ height="4745.9922"
+ x="-23349.98"
+ y="-37631.66"
+ ry="237.13931"
+ rx="170.90491" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:60.68051147;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;display:inline;overflow:hidden"
+ d="m -23165.37,-38619.628 8395.855,0 c 116.851,0 210.922,93.781 210.922,210.271 l 0,998.969 c 0,117.351 -94.071,-249.104 -210.922,-249.104 l -8395.855,0 c -116.851,0 -210.921,114.705 -210.921,236.604 l 0,-986.469 c 0,-116.49 94.07,-210.271 210.921,-210.271 z"
+ id="rect6252-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:998.16912842px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-19415.262"
+ y="-37924.801"
+ id="text6254-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="-19415.262"
+ y="-37924.801"
+ style="font-size:995.97320557px;fill:#000000;fill-opacity:1"
+ id="tspan6258-9">your-presentation.svg</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:497.44116211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-20644.576"
+ y="-27089.012"
+ id="text5790-5-5-5"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6-9"
+ sodipodi:role="line"
+ x="-20644.576"
+ y="-27089.012">view rectangles</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:497.44116211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-20644.576"
+ y="-26505.875"
+ id="text5790-5-5-1-7"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6-1-8"
+ sodipodi:role="line"
+ x="-20644.576"
+ y="-26505.875">visible elements</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:497.44116211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-20691.455"
+ y="-28255.293"
+ id="text5790-5-4-5"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-4-3"
+ sodipodi:role="line"
+ x="-20691.455"
+ y="-28255.293">&lt;script&gt;traction&lt;/script&gt;</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:497.44116211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-20691.455"
+ y="-27672.152"
+ id="text5790-5-4-5-1"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-4-3-7"
+ sodipodi:role="line"
+ x="-20691.455"
+ y="-27672.152">&lt;config&gt;...&lt;/config&gt;</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5790-5-5-2"
+ y="-33150.043"
+ x="-37333.422"
+ style="font-size:889.58660889px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ xml:space="preserve"><tspan
+ y="-33150.043"
+ x="-37333.422"
+ sodipodi:role="line"
+ id="tspan5824-9-6-8">Develop</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5790-5-5-2-8"
+ y="-33150.043"
+ x="-17621.318"
+ style="font-size:889.58660889px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ xml:space="preserve"><tspan
+ y="-33150.043"
+ x="-17621.318"
+ sodipodi:role="line"
+ id="tspan5824-9-6-8-3">Share</tspan></text>
+ <g
+ id="welcome"
+ inkscape:label="#g3258">
+ <text
+ inkscape:label="#text5790-5-5-2-0"
+ xml:space="preserve"
+ style="font-size:6337.86816406px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ x="-44922.609"
+ y="-45262.762"
+ id="welcome-text"
+ sodipodi:linespacing="125%"><tspan
+ id="tspan5824-9-6-8-9"
+ sodipodi:role="line"
+ x="-44922.609"
+ y="-45262.762">Welcome to</tspan><tspan
+ id="tspan3092"
+ sodipodi:role="line"
+ x="-44922.609"
+ y="-37340.426">TractionSVG</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5790-5-5-2-0-9"
+ y="-15052.125"
+ x="-44775.613"
+ style="font-size:6337.86816406px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;overflow:hidden;font-family:Verdana;-inkscape-font-specification:Verdana"
+ xml:space="preserve"><tspan
+ y="-15052.125"
+ x="-44775.613"
+ sodipodi:role="line"
+ id="tspan3092-2">Don't Panic!</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="views"
+ style="display:inline">
+ <rect
+ y="-34658.895"
+ x="-43565.617"
+ height="12100.95"
+ width="16109.612"
+ id="view-dev"
+ style="fill:none;stroke:#09ff00;stroke-width:86.39134979;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;overflow:hidden"
+ inkscape:label="#rect6043" />
+ <rect
+ y="-34669.992"
+ x="-24360.422"
+ height="12100.95"
+ width="16109.612"
+ id="view-share"
+ style="fill:none;stroke:#09ff00;stroke-width:86.39134979;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;overflow:hidden"
+ inkscape:label="#rect6043" />
+ <rect
+ inkscape:label="#rect6043"
+ style="fill:none;stroke:#09ff00;stroke-width:286.82684326;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;overflow:hidden"
+ id="view-begin"
+ width="53485.32"
+ height="40176.215"
+ x="-52543.352"
+ y="-52980.914" />
+ <rect
+ y="-39814.938"
+ x="-46198.562"
+ height="30644.266"
+ width="40795.738"
+ id="view-final"
+ style="fill:none;stroke:#09ff00;stroke-width:218.77615356;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;overflow:hidden"
+ inkscape:label="#rect6043" />
+ </g>
+</svg>
3 example/lighttpd.conf
@@ -0,0 +1,3 @@
+include_shell "/usr/share/lighttpd/create-mime.assign.pl"
+server.port = 8080
+server.document-root = "."
152 example/traction-0.0.1.js
@@ -0,0 +1,152 @@
+function c(a){throw a;}var h=void 0,j=true,k=null,m=false;function aa(){return function(a){return a}}function o(a){return function(){return this[a]}}function p(a){return function(){return a}}var q,ba=ba||{},s=this;function ca(a){for(var a=a.split("."),b=s,d;d=a.shift();)if(b[d]!=k)b=b[d];else return k;return b}function da(){}
+function t(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var d=Object.prototype.toString.call(a);if(d=="[object Window]")return"object";if(d=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(d=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function u(a){return a!==h}function ea(a){var b=t(a);return b=="array"||b=="object"&&typeof a.length=="number"}function x(a){return typeof a=="string"}function fa(a){return typeof a=="number"}function ga(a){return t(a)=="function"}function ha(a){a=t(a);return a=="object"||a=="array"||a=="function"}function y(a){return a[ia]||(a[ia]=++ja)}var ia="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36),ja=0;
+function ka(a,b,d){return a.call.apply(a.bind,arguments)}function la(a,b,d){var e=b||s;if(arguments.length>2){var f=Array.prototype.slice.call(arguments,2);return function(){var b=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(b,f);return a.apply(e,b)}}else return function(){return a.apply(e,arguments)}}function ma(a,b,d){ma=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?ka:la;return ma.apply(k,arguments)}
+function na(a,b){var d=Array.prototype.slice.call(arguments,1);return function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,d);return a.apply(this,b)}}var oa=Date.now||function(){return+new Date};function pa(a,b){function d(){}d.prototype=b.prototype;a.I=b.prototype;a.prototype=new d};function qa(){}qa.prototype.Na=m;qa.prototype.O=function(){if(!this.Na)this.Na=j,this.j()};qa.prototype.j=function(){};function ra(a){this.stack=Error().stack||"";if(a)this.message=String(a)}pa(ra,Error);ra.prototype.name="CustomError";function sa(a,b){for(var d=1;d<arguments.length;d++)var e=String(arguments[d]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,e);return a}function ta(a){if(!ua.test(a))return a;a.indexOf("&")!=-1&&(a=a.replace(va,"&amp;"));a.indexOf("<")!=-1&&(a=a.replace(wa,"&lt;"));a.indexOf(">")!=-1&&(a=a.replace(xa,"&gt;"));a.indexOf('"')!=-1&&(a=a.replace(ya,"&quot;"));return a}
+var va=/&/g,wa=/</g,xa=/>/g,ya=/\"/g,ua=/[&<>\"]/,za={"\x00":"\\0","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\x0B",'"':'\\"',"\\":"\\\\"},Aa={"'":"\\'"};
+function Ba(a){var n;a=String(a);if(a.quote)return a.quote();else{for(var b=['"'],d=0;d<a.length;d++){var e=a.charAt(d),f=e.charCodeAt(0),g=b,i=d+1,l;if(!(l=za[e])){if(!(f>31&&f<127))if(e in Aa)e=Aa[e];else if(e in za)n=Aa[e]=za[e],e=n;else{f=e;l=e.charCodeAt(0);if(l>31&&l<127)f=e;else{if(l<256){if(f="\\x",l<16||l>256)f+="0"}else f="\\u",l<4096&&(f+="0");f+=l.toString(16).toUpperCase()}e=Aa[e]=f}l=e}g[i]=l}b.push('"');return b.join("")}}
+function Ca(a,b){for(var d=0,e=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),f=String(b).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),g=Math.max(e.length,f.length),i=0;d==0&&i<g;i++){var l=e[i]||"",n=f[i]||"",r=RegExp("(\\d*)(\\D*)","g"),v=RegExp("(\\d*)(\\D*)","g");do{var w=r.exec(l)||["","",""],P=v.exec(n)||["","",""];if(w[0].length==0&&P[0].length==0)break;d=Da(w[1].length==0?0:parseInt(w[1],10),P[1].length==0?0:parseInt(P[1],10))||Da(w[2].length==0,P[2].length==0)||Da(w[2],P[2])}while(d==
+0)}return d}function Da(a,b){if(a<b)return-1;else if(a>b)return 1;return 0}function Ea(a){for(var b=0,d=0;d<a.length;++d)b=31*b+a.charCodeAt(d),b%=4294967296;return b};function Fa(a,b){b.unshift(a);ra.call(this,sa.apply(k,b));b.shift();this.tb=a}pa(Fa,ra);Fa.prototype.name="AssertionError";function Ga(a,b){c(new Fa("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)))};var Ha=Array.prototype,Ia=Ha.indexOf?function(a,b,d){return Ha.indexOf.call(a,b,d)}:function(a,b,d){d=d==k?0:d<0?Math.max(0,a.length+d):d;if(x(a))return!x(b)||b.length!=1?-1:a.indexOf(b,d);for(;d<a.length;d++)if(d in a&&a[d]===b)return d;return-1},Ja=Ha.forEach?function(a,b,d){Ha.forEach.call(a,b,d)}:function(a,b,d){for(var e=a.length,f=x(a)?a.split(""):a,g=0;g<e;g++)g in f&&b.call(d,f[g],g,a)};function Ka(a,b){var d=Ia(a,b);d>=0&&Ha.splice.call(a,d,1)}
+function La(a){return Ha.concat.apply(Ha,arguments)}function Ma(a){if(t(a)=="array")return La(a);else{for(var b=[],d=0,e=a.length;d<e;d++)b[d]=a[d];return b}}function Na(a,b,d){return arguments.length<=2?Ha.slice.call(a,b):Ha.slice.call(a,b,d)};var Oa,Pa,Qa,Ra;function Sa(){return s.navigator?s.navigator.userAgent:k}Ra=Qa=Pa=Oa=m;var Ta;if(Ta=Sa()){var Ua=s.navigator;Oa=Ta.indexOf("Opera")==0;Pa=!Oa&&Ta.indexOf("MSIE")!=-1;Qa=!Oa&&Ta.indexOf("WebKit")!=-1;Ra=!Oa&&!Qa&&Ua.product=="Gecko"}var Va=Oa,z=Pa,Wa=Ra,Xa=Qa,Ya=s.navigator,Za=(Ya&&Ya.platform||"").indexOf("Mac")!=-1,$a;
+a:{var ab="",bb;if(Va&&s.opera)var cb=s.opera.version,ab=typeof cb=="function"?cb():cb;else if(Wa?bb=/rv\:([^\);]+)(\)|;)/:z?bb=/MSIE\s+([^\);]+)(\)|;)/:Xa&&(bb=/WebKit\/(\S+)/),bb)var db=bb.exec(Sa()),ab=db?db[1]:"";if(z){var eb,fb=s.document;eb=fb?fb.documentMode:h;if(eb>parseFloat(ab)){$a=String(eb);break a}}$a=ab}var gb={};function hb(a){return gb[a]||(gb[a]=Ca($a,a)>=0)};var ib;!z||hb("9");z&&hb("8");function jb(a,b){this.type=a;this.currentTarget=this.target=b}pa(jb,qa);jb.prototype.j=function(){delete this.type;delete this.target;delete this.currentTarget};jb.prototype.T=m;jb.prototype.sa=j;var kb=new Function("a","return a");function lb(a,b){a&&this.aa(a,b)}pa(lb,jb);q=lb.prototype;q.target=k;q.relatedTarget=k;q.offsetX=0;q.offsetY=0;q.clientX=0;q.clientY=0;q.screenX=0;q.screenY=0;q.button=0;q.keyCode=0;q.charCode=0;q.ctrlKey=m;q.altKey=m;q.shiftKey=m;q.metaKey=m;q.kb=m;q.za=k;
+q.aa=function(a,b){var d=this.type=a.type;jb.call(this,d);this.target=a.target||a.srcElement;this.currentTarget=b;var e=a.relatedTarget;if(e){if(Wa)try{kb(e.nodeName)}catch(f){e=k}}else if(d=="mouseover")e=a.fromElement;else if(d=="mouseout")e=a.toElement;this.relatedTarget=e;this.offsetX=a.offsetX!==h?a.offsetX:a.layerX;this.offsetY=a.offsetY!==h?a.offsetY:a.layerY;this.clientX=a.clientX!==h?a.clientX:a.pageX;this.clientY=a.clientY!==h?a.clientY:a.pageY;this.screenX=a.screenX||0;this.screenY=a.screenY||
+0;this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||(d=="keypress"?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.kb=Za?a.metaKey:a.ctrlKey;this.state=a.state;this.za=a;delete this.sa;delete this.T};q.j=function(){lb.I.j.call(this);this.relatedTarget=this.currentTarget=this.target=this.za=k};function mb(){}var nb=0;q=mb.prototype;q.key=0;q.U=m;q.Ha=m;q.aa=function(a,b,d,e,f,g){ga(a)?this.Sa=j:a&&a.handleEvent&&ga(a.handleEvent)?this.Sa=m:c(Error("Invalid listener argument"));this.fa=a;this.Xa=b;this.src=d;this.type=e;this.capture=!!f;this.Ba=g;this.Ha=m;this.key=++nb;this.U=m};q.handleEvent=function(a){return this.Sa?this.fa.call(this.Ba||this.src,a):this.fa.handleEvent.call(this.fa,a)};function ob(a,b){this.Ua=b;this.D=[];a>this.Ua&&c(Error("[goog.structs.SimplePool] Initial cannot be greater than max"));for(var d=0;d<a;d++)this.D.push(this.s?this.s():{})}pa(ob,qa);ob.prototype.s=k;ob.prototype.Ma=k;function pb(a){return a.D.length?a.D.pop():a.s?a.s():{}}function qb(a,b){a.D.length<a.Ua?a.D.push(b):rb(a,b)}function rb(a,b){if(a.Ma)a.Ma(b);else if(ha(b))if(ga(b.O))b.O();else for(var d in b)delete b[d]}
+ob.prototype.j=function(){ob.I.j.call(this);for(var a=this.D;a.length;)rb(this,a.pop());delete this.D};var sb,tb=(sb="ScriptEngine"in s&&s.ScriptEngine()=="JScript")?s.ScriptEngineMajorVersion()+"."+s.ScriptEngineMinorVersion()+"."+s.ScriptEngineBuildVersion():"0";var ub,vb,wb,xb,yb,zb,Ab,Bb,Cb,Db,Eb;
+(function(){function a(){return{f:0,k:0}}function b(){return[]}function d(){function a(b){return i.call(a.src,a.key,b)}return a}function e(){return new mb}function f(){return new lb}var g=sb&&!(Ca(tb,"5.7")>=0),i;zb=function(a){i=a};if(g){ub=function(){return pb(l)};vb=function(a){qb(l,a)};wb=function(){return pb(n)};xb=function(a){qb(n,a)};yb=function(){return pb(r)};Ab=function(){qb(r,d())};Bb=function(){return pb(v)};Cb=function(a){qb(v,a)};Db=function(){return pb(w)};Eb=function(a){qb(w,a)};var l=
+new ob(0,600);l.s=a;var n=new ob(0,600);n.s=b;var r=new ob(0,600);r.s=d;var v=new ob(0,600);v.s=e;var w=new ob(0,600);w.s=f}else ub=a,vb=da,wb=b,xb=da,yb=d,Ab=da,Bb=e,Cb=da,Db=f,Eb=da})();function Fb(a,b,d){for(var e in a)b.call(d,a[e],e,a)}function Gb(a){var b=[],d=0,e;for(e in a)b[d++]=a[e];return b}function Hb(a){var b=[],d=0,e;for(e in a)b[d++]=e;return b}function Ib(){var a=Jb,b;for(b in a)return m;return j}function Kb(a){var b={},d;for(d in a)b[d]=a[d];return b}var Lb="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",");
+function Mb(a,b){for(var d,e,f=1;f<arguments.length;f++){e=arguments[f];for(d in e)a[d]=e[d];for(var g=0;g<Lb.length;g++)d=Lb[g],Object.prototype.hasOwnProperty.call(e,d)&&(a[d]=e[d])}};var Nb={},A={},Ob={},Pb={};
+function B(a,b,d,e,f){if(b)if(t(b)=="array"){for(var g=0;g<b.length;g++)B(a,b[g],d,e,f);return k}else{var e=!!e,i=A;b in i||(i[b]=ub());i=i[b];e in i||(i[e]=ub(),i.f++);var i=i[e],l=y(a),n;i.k++;if(i[l]){n=i[l];for(g=0;g<n.length;g++)if(i=n[g],i.fa==d&&i.Ba==f){if(i.U)break;return n[g].key}}else n=i[l]=wb(),i.f++;g=yb();g.src=a;i=Bb();i.aa(d,g,a,b,e,f);d=i.key;g.key=d;n.push(i);Nb[d]=i;Ob[l]||(Ob[l]=wb());Ob[l].push(i);a.addEventListener?(a==s||!a.La)&&a.addEventListener(b,g,e):a.attachEvent(b in
+Pb?Pb[b]:Pb[b]="on"+b,g);return d}else c(Error("Invalid event type"))}function Qb(a,b,d,e,f){if(t(b)=="array")for(var g=0;g<b.length;g++)Qb(a,b[g],d,e,f);else{e=!!e;a:{g=A;if(b in g&&(g=g[b],e in g&&(g=g[e],a=y(a),g[a]))){a=g[a];break a}a=k}if(a)for(g=0;g<a.length;g++)if(a[g].fa==d&&a[g].capture==e&&a[g].Ba==f){Rb(a[g].key);break}}}
+function Rb(a){if(Nb[a]){var b=Nb[a];if(!b.U){var d=b.src,e=b.type,f=b.Xa,g=b.capture;d.removeEventListener?(d==s||!d.La)&&d.removeEventListener(e,f,g):d.detachEvent&&d.detachEvent(e in Pb?Pb[e]:Pb[e]="on"+e,f);d=y(d);f=A[e][g][d];if(Ob[d]){var i=Ob[d];Ka(i,b);i.length==0&&delete Ob[d]}b.U=j;f.Va=j;Sb(e,g,d,f);delete Nb[a]}}}
+function Sb(a,b,d,e){if(!e.qa&&e.Va){for(var f=0,g=0;f<e.length;f++)if(e[f].U){var i=e[f].Xa;i.src=k;Ab(i);Cb(e[f])}else f!=g&&(e[g]=e[f]),g++;e.length=g;e.Va=m;g==0&&(xb(e),delete A[a][b][d],A[a][b].f--,A[a][b].f==0&&(vb(A[a][b]),delete A[a][b],A[a].f--),A[a].f==0&&(vb(A[a]),delete A[a]))}}
+function Tb(a){var b,d=0,e=b==k;b=!!b;if(a==k)Fb(Ob,function(a){for(var f=a.length-1;f>=0;f--){var g=a[f];if(e||b==g.capture)Rb(g.key),d++}});else if(a=y(a),Ob[a])for(var a=Ob[a],f=a.length-1;f>=0;f--){var g=a[f];if(e||b==g.capture)Rb(g.key),d++}}function Ub(a,b,d,e,f){var g=1,b=y(b);if(a[b]){a.k--;a=a[b];a.qa?a.qa++:a.qa=1;try{for(var i=a.length,l=0;l<i;l++){var n=a[l];n&&!n.U&&(g&=Vb(n,f)!==m)}}finally{a.qa--,Sb(d,e,b,a)}}return Boolean(g)}
+function Vb(a,b){var d=a.handleEvent(b);a.Ha&&Rb(a.key);return d}
+zb(function(a,b){if(!Nb[a])return j;var d=Nb[a],e=d.type,f=A;if(!(e in f))return j;var f=f[e],g,i;ib===h&&(ib=z&&!s.addEventListener);if(ib){g=b||ca("window.event");var l=j in f,n=m in f;if(l){if(g.keyCode<0||g.returnValue!=h)return j;a:{var r=m;if(g.keyCode==0)try{g.keyCode=-1;break a}catch(v){r=j}if(r||g.returnValue==h)g.returnValue=j}}r=Db();r.aa(g,this);g=j;try{if(l){for(var w=wb(),P=r.currentTarget;P;P=P.parentNode)w.push(P);i=f[j];i.k=i.f;for(var T=w.length-1;!r.T&&T>=0&&i.k;T--)r.currentTarget=
+w[T],g&=Ub(i,w[T],e,j,r);if(n){i=f[m];i.k=i.f;for(T=0;!r.T&&T<w.length&&i.k;T++)r.currentTarget=w[T],g&=Ub(i,w[T],e,m,r)}}else g=Vb(d,r)}finally{if(w)w.length=0,xb(w);r.O();Eb(r)}return g}e=new lb(b,this);try{g=Vb(d,e)}finally{e.O()}return g});function Wb(){}pa(Wb,qa);q=Wb.prototype;q.La=j;q.Fa=k;q.addEventListener=function(a,b,d,e){B(this,a,b,d,e)};q.removeEventListener=function(a,b,d,e){Qb(this,a,b,d,e)};
+q.dispatchEvent=function(a){var b=a.type||a,d=A;if(b in d){if(x(a))a=new jb(a,this);else if(a instanceof jb)a.target=a.target||this;else{var e=a,a=new jb(b,this);Mb(a,e)}var e=1,f,d=d[b],b=j in d,g;if(b){f=[];for(g=this;g;g=g.Fa)f.push(g);g=d[j];g.k=g.f;for(var i=f.length-1;!a.T&&i>=0&&g.k;i--)a.currentTarget=f[i],e&=Ub(g,f[i],a.type,j,a)&&a.sa!=m}if(m in d)if(g=d[m],g.k=g.f,b)for(i=0;!a.T&&i<f.length&&g.k;i++)a.currentTarget=f[i],e&=Ub(g,f[i],a.type,m,a)&&a.sa!=m;else for(f=this;!a.T&&f&&g.k;f=f.Fa)a.currentTarget=
+f,e&=Ub(g,f,a.type,m,a)&&a.sa!=m;a=Boolean(e)}else a=j;return a};q.j=function(){Wb.I.j.call(this);Tb(this);this.Fa=k};var Xb=s.window;function Yb(a){if(typeof a.ma=="function")return a.ma();if(x(a))return a.split("");if(ea(a)){for(var b=[],d=a.length,e=0;e<d;e++)b.push(a[e]);return b}return Gb(a)}function Zb(a,b,d){if(typeof a.forEach=="function")a.forEach(b,d);else if(ea(a)||x(a))Ja(a,b,d);else{var e;if(typeof a.Aa=="function")e=a.Aa();else if(typeof a.ma!="function")if(ea(a)||x(a)){e=[];for(var f=a.length,g=0;g<f;g++)e.push(g)}else e=Hb(a);else e=h;for(var f=Yb(a),g=f.length,i=0;i<g;i++)b.call(d,f[i],e&&e[i],a)}};function $b(a,b){this.S={};this.g=[];var d=arguments.length;if(d>1){d%2&&c(Error("Uneven number of arguments"));for(var e=0;e<d;e+=2)this.set(arguments[e],arguments[e+1])}else if(a){a instanceof $b?(d=a.Aa(),e=a.ma()):(d=Hb(a),e=Gb(a));for(var f=0;f<d.length;f++)this.set(d[f],e[f])}}q=$b.prototype;q.f=0;q.$a=0;q.ma=function(){ac(this);for(var a=[],b=0;b<this.g.length;b++)a.push(this.S[this.g[b]]);return a};q.Aa=function(){ac(this);return this.g.concat()};
+q.clear=function(){this.S={};this.$a=this.f=this.g.length=0};function ac(a){if(a.f!=a.g.length){for(var b=0,d=0;b<a.g.length;){var e=a.g[b];Object.prototype.hasOwnProperty.call(a.S,e)&&(a.g[d++]=e);b++}a.g.length=d}if(a.f!=a.g.length){for(var f={},d=b=0;b<a.g.length;)e=a.g[b],Object.prototype.hasOwnProperty.call(f,e)||(a.g[d++]=e,f[e]=1),b++;a.g.length=d}}q.set=function(a,b){Object.prototype.hasOwnProperty.call(this.S,a)||(this.f++,this.g.push(a),this.$a++);this.S[a]=b};q.Ka=function(){return new $b(this)};function bc(a){return cc(a||arguments.callee.caller,[])}
+function cc(a,b){var d=[];if(Ia(b,a)>=0)d.push("[...circular reference...]");else if(a&&b.length<50){d.push(dc(a)+"(");for(var e=a.arguments,f=0;f<e.length;f++){f>0&&d.push(", ");var g;g=e[f];switch(typeof g){case "object":g=g?"object":"null";break;case "string":break;case "number":g=String(g);break;case "boolean":g=g?"true":"false";break;case "function":g=(g=dc(g))?g:"[fn]";break;default:g=typeof g}g.length>40&&(g=g.substr(0,40)+"...");d.push(g)}b.push(a);d.push(")\n");try{d.push(cc(a.caller,b))}catch(i){d.push("[exception trying to get caller]\n")}}else a?
+d.push("[...long stack...]"):d.push("[end]");return d.join("")}function dc(a){a=String(a);if(!ec[a]){var b=/function ([^\(]+)/.exec(a);ec[a]=b?b[1]:"[Anonymous]"}return ec[a]}var ec={};function fc(a,b,d,e,f){this.reset(a,b,d,e,f)}fc.prototype.lb=0;fc.prototype.Pa=k;fc.prototype.Oa=k;var gc=0;fc.prototype.reset=function(a,b,d,e,f){this.lb=typeof f=="number"?f:gc++;this.vb=e||oa();this.ea=a;this.hb=b;this.sb=d;delete this.Pa;delete this.Oa};fc.prototype.Za=function(a){this.ea=a};function hc(a){this.ib=a}hc.prototype.ra=k;hc.prototype.ea=k;hc.prototype.xa=k;hc.prototype.Ra=k;function ic(a,b){this.name=a;this.value=b}ic.prototype.toString=o("name");var jc=new ic("SEVERE",1E3),kc=new ic("WARNING",900),lc=new ic("CONFIG",700),mc=new ic("FINE",500),nc=new ic("FINEST",300);hc.prototype.getParent=o("ra");hc.prototype.Za=function(a){this.ea=a};function oc(a){if(a.ea)return a.ea;if(a.ra)return oc(a.ra);Ga("Root logger has no level set.");return k}
+hc.prototype.log=function(a,b,d){if(a.value>=oc(this).value){a=this.eb(a,b,d);s.console&&s.console.markTimeline&&s.console.markTimeline("log:"+a.hb);for(b=this;b;){var d=b,e=a;if(d.Ra)for(var f=0,g=h;g=d.Ra[f];f++)g(e);b=b.getParent()}}};
+hc.prototype.eb=function(a,b,d){var e=new fc(a,String(b),this.ib);if(d){e.Pa=d;var f;var g=arguments.callee.caller;try{var i;var l=ca("window.location.href");if(x(d))i={message:d,name:"Unknown error",lineNumber:"Not available",fileName:l,stack:"Not available"};else{var n,r,v=m;try{n=d.lineNumber||d.rb||"Not available"}catch(w){n="Not available",v=j}try{r=d.fileName||d.filename||d.sourceURL||l}catch(P){r="Not available",v=j}i=v||!d.lineNumber||!d.fileName||!d.stack?{message:d.message,name:d.name,lineNumber:n,
+fileName:r,stack:d.stack||"Not available"}:d}f="Message: "+ta(i.message)+'\nUrl: <a href="view-source:'+i.fileName+'" target="_new">'+i.fileName+"</a>\nLine: "+i.lineNumber+"\n\nBrowser stack:\n"+ta(i.stack+"-> ")+"[end]\n\nJS stack traversal:\n"+ta(bc(g)+"-> ")}catch(T){f="Exception trying to expose exception! You win, we lose. "+T}e.Oa=f}return e};function C(a,b){a.log(mc,b,h)}var pc={},qc=k;
+function rc(a){qc||(qc=new hc(""),pc[""]=qc,qc.Za(lc));var b;if(!(b=pc[a])){b=new hc(a);var d=a.lastIndexOf("."),e=a.substr(d+1),d=rc(a.substr(0,d));if(!d.xa)d.xa={};d.xa[e]=b;b.ra=d;pc[a]=b}return b};function sc(){}sc.prototype.ha=k;function tc(){return uc(vc)}var vc;function wc(){}pa(wc,sc);function uc(a){return(a=xc(a))?new ActiveXObject(a):new XMLHttpRequest}function yc(a){var b={};xc(a)&&(b[0]=j,b[1]=j);return b}wc.prototype.Ca=k;
+function xc(a){if(!a.Ca&&typeof XMLHttpRequest=="undefined"&&typeof ActiveXObject!="undefined"){for(var b=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],d=0;d<b.length;d++){var e=b[d];try{return new ActiveXObject(e),a.Ca=e}catch(f){}}c(Error("Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed"))}return a.Ca}vc=new wc;function zc(){if(Wa)this.C={},this.va={},this.ta=[]}zc.prototype.e=rc("goog.net.xhrMonitor");zc.prototype.la=Wa;function Ac(a){var b=Bc;if(b.la){var d=x(a)?a:ha(a)?y(a):"";b.e.log(nc,"Pushing context: "+a+" ("+d+")",h);b.ta.push(d)}}function Cc(){var a=Bc;if(a.la){var b=a.ta.pop();a.e.log(nc,"Popping context: "+b,h);Dc(a,b)}}function Ec(a){var b=Bc;if(b.la){a=y(a);C(b.e,"Opening XHR : "+a);for(var d=0;d<b.ta.length;d++){var e=b.ta[d];Fc(b.C,e,a);Fc(b.va,a,e)}}}
+function Dc(a,b){var d=a.va[b],e=a.C[b];d&&e&&(a.e.log(nc,"Updating dependent contexts",h),Ja(d,function(a){Ja(e,function(b){Fc(this.C,a,b);Fc(this.va,b,a)},this)},a))}function Fc(a,b,d){a[b]||(a[b]=[]);Ia(a[b],d)>=0||a[b].push(d)}var Bc=new zc;var Gc=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\w\\d\\-\\u0100-\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$");function Hc(a){this.headers=new $b;this.W=a||k}pa(Hc,Wb);Hc.prototype.e=rc("goog.net.XhrIo");var Ic=/^https?:?$/i,Jc=[];function Kc(a,b,d,e,f,g){var i=new Hc;Jc.push(i);b&&B(i,"complete",b);B(i,"ready",na(Lc,i));if(g)i.ga=Math.max(0,g);i.send(a,d,e,f)}function Lc(a){a.O();Ka(Jc,a)}q=Hc.prototype;q.t=m;q.c=k;q.ua=k;q.da="";q.Ta="";q.ba=0;q.ca="";q.ya=m;q.na=m;q.Da=m;q.G=m;q.ga=0;q.J=k;q.Ya="";q.pb=m;
+q.send=function(a,b,d,e){this.c&&c(Error("[goog.net.XhrIo] Object is active with another request"));b=b||"GET";this.da=a;this.ca="";this.ba=0;this.Ta=b;this.ya=m;this.t=j;this.c=this.W?uc(this.W):new tc;this.ua=this.W?this.W.ha||(this.W.ha=yc(this.W)):vc.ha||(vc.ha=yc(vc));Ec(this.c);this.c.onreadystatechange=ma(this.Wa,this);try{C(this.e,Mc(this,"Opening Xhr")),this.Da=j,this.c.open(b,a,j),this.Da=m}catch(f){C(this.e,Mc(this,"Error opening Xhr: "+f.message));Nc(this,f);return}var a=d||"",g=this.headers.Ka();
+e&&Zb(e,function(a,b){g.set(b,a)});b=="POST"&&!Object.prototype.hasOwnProperty.call(g.S,"Content-Type")&&g.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");Zb(g,function(a,b){this.c.setRequestHeader(b,a)},this);if(this.Ya)this.c.responseType=this.Ya;if("withCredentials"in this.c)this.c.withCredentials=this.pb;try{if(this.J)Xb.clearTimeout(this.J),this.J=k;if(this.ga>0)C(this.e,Mc(this,"Will abort after "+this.ga+"ms if incomplete")),this.J=Xb.setTimeout(ma(this.mb,this),this.ga);
+C(this.e,Mc(this,"Sending request"));this.na=j;this.c.send(a);this.na=m}catch(i){C(this.e,Mc(this,"Send error: "+i.message)),Nc(this,i)}};q.dispatchEvent=function(a){if(this.c){Ac(this.c);try{return Hc.I.dispatchEvent.call(this,a)}finally{Cc()}}else return Hc.I.dispatchEvent.call(this,a)};q.mb=function(){if(typeof ba!="undefined"&&this.c)this.ca="Timed out after "+this.ga+"ms, aborting",this.ba=8,C(this.e,Mc(this,this.ca)),this.dispatchEvent("timeout"),this.abort(8)};
+function Nc(a,b){a.t=m;if(a.c)a.G=j,a.c.abort(),a.G=m;a.ca=b;a.ba=5;Oc(a);Pc(a)}function Oc(a){if(!a.ya)a.ya=j,a.dispatchEvent("complete"),a.dispatchEvent("error")}q.abort=function(a){if(this.c&&this.t)C(this.e,Mc(this,"Aborting")),this.t=m,this.G=j,this.c.abort(),this.G=m,this.ba=a||7,this.dispatchEvent("complete"),this.dispatchEvent("abort"),Pc(this)};q.j=function(){if(this.c){if(this.t)this.t=m,this.G=j,this.c.abort(),this.G=m;Pc(this,j)}Hc.I.j.call(this)};
+q.Wa=function(){!this.Da&&!this.na&&!this.G?this.jb():Qc(this)};q.jb=function(){Qc(this)};
+function Qc(a){if(a.t&&typeof ba!="undefined")if(a.ua[1]&&Rc(a)==4&&Sc(a)==2)C(a.e,Mc(a,"Local request error detected and ignored"));else if(a.na&&Rc(a)==4)Xb.setTimeout(ma(a.Wa,a),0);else if(a.dispatchEvent("readystatechange"),Rc(a)==4){C(a.e,Mc(a,"Request complete"));a.t=m;var b;a:switch(Sc(a)){case 0:b=x(a.da)?a.da.match(Gc)[1]||k:a.da.qb();b=!(b?Ic.test(b):self.location?Ic.test(self.location.protocol):1);break a;case 200:case 204:case 304:b=j;break a;default:b=m}if(b)a.dispatchEvent("complete"),
+a.dispatchEvent("success");else{a.ba=6;var d;try{d=Rc(a)>2?a.c.statusText:""}catch(e){C(a.e,"Can not get status: "+e.message),d=""}a.ca=d+" ["+Sc(a)+"]";Oc(a)}Pc(a)}}
+function Pc(a,b){if(a.c){var d=a.c,e=a.ua[0]?da:k;a.c=k;a.ua=k;if(a.J)Xb.clearTimeout(a.J),a.J=k;b||(Ac(d),a.dispatchEvent("ready"),Cc());var f=Bc;if(f.la){var g=y(d);C(f.e,"Closing XHR : "+g);delete f.va[g];for(var i in f.C)Ka(f.C[i],g),f.C[i].length==0&&delete f.C[i]}try{d.onreadystatechange=e}catch(l){a.e.log(jc,"Problem encountered resetting onreadystatechange: "+l.message,h)}}}function Rc(a){return a.c?a.c.readyState:0}
+function Sc(a){try{return Rc(a)>2?a.c.status:-1}catch(b){return a.e.log(kc,"Can not get status: "+b.message,h),-1}}function Mc(a,b){return b+" ["+a.Ta+" "+a.da+" "+Sc(a)+"]"};function Tc(a,b){this.l=sb?[]:"";a!=k&&this.append.apply(this,arguments)}Tc.prototype.set=function(a){this.clear();this.append(a)};sb?(Tc.prototype.wa=0,Tc.prototype.append=function(a,b,d){b==k?this.l[this.wa++]=a:(this.l.push.apply(this.l,arguments),this.wa=this.l.length);return this}):Tc.prototype.append=function(a,b,d){this.l+=a;if(b!=k)for(var e=1;e<arguments.length;e++)this.l+=arguments[e];return this};Tc.prototype.clear=function(){sb?this.wa=this.l.length=0:this.l=""};
+Tc.prototype.toString=function(){if(sb){var a=this.l.join("");this.clear();a&&this.append(a);return a}else return this.l};var Jb={},Uc=k;function Vc(){Xb.clearTimeout(Uc);oa();for(var a in Jb)Jb[a].cb();Uc=Ib()?k:Xb.setTimeout(Vc,100)}function Wc(a){var b=y(a);b in Jb||(Jb[b]=a);Uc||(Uc=Xb.setTimeout(Vc,100))}function Xc(a){a=y(a);delete Jb[a];Uc&&Ib()&&(Xb.clearTimeout(Uc),Uc=k)};function Yc(a,b,d,e,f){if(!z&&(!Xa||!hb("525")))return j;if(Za&&f)return Zc(a);if(f&&!e)return m;if(!d&&(b==17||b==18))return m;if(z&&e&&b==a)return m;switch(a){case 13:return j;case 27:return!Xa}return Zc(a)}
+function Zc(a){if(a>=48&&a<=57)return j;if(a>=96&&a<=106)return j;if(a>=65&&a<=90)return j;if(Xa&&a==0)return j;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return j;default:return m}};function $c(a,b){if(a)this.pa&&this.detach(),this.Q=a,this.oa=B(this.Q,"keypress",this,b),this.Ea=B(this.Q,"keydown",this.fb,b,this),this.pa=B(this.Q,"keyup",this.gb,b,this)}pa($c,Wb);q=$c.prototype;q.Q=k;q.oa=k;q.Ea=k;q.pa=k;q.A=-1;q.z=-1;
+var ad={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},bd={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},cd={61:187,59:186},dd=z||Xa&&hb("525");q=$c.prototype;
+q.fb=function(a){if(Xa&&(this.A==17&&!a.ctrlKey||this.A==18&&!a.altKey))this.z=this.A=-1;dd&&!Yc(a.keyCode,this.A,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):this.z=Wa&&a.keyCode in cd?cd[a.keyCode]:a.keyCode};q.gb=function(){this.z=this.A=-1};
+q.handleEvent=function(a){var b=a.za,d,e;z&&a.type=="keypress"?(d=this.z,e=d!=13&&d!=27?b.keyCode:0):Xa&&a.type=="keypress"?(d=this.z,e=b.charCode>=0&&b.charCode<63232&&Zc(d)?b.charCode:0):Va?(d=this.z,e=Zc(d)?b.keyCode:0):(d=b.keyCode||this.z,e=b.charCode||0,Za&&e==63&&!d&&(d=191));var f=d,g=b.keyIdentifier;d?d>=63232&&d in ad?f=ad[d]:d==25&&a.shiftKey&&(f=9):g&&g in bd&&(f=bd[g]);a=f==this.A;this.A=f;b=new ed(f,e,a,b);try{this.dispatchEvent(b)}finally{b.O()}};q.Qa=o("Q");
+q.detach=function(){if(this.oa)Rb(this.oa),Rb(this.Ea),Rb(this.pa),this.pa=this.Ea=this.oa=k;this.Q=k;this.z=this.A=-1};q.j=function(){$c.I.j.call(this);this.detach()};function ed(a,b,d,e){e&&this.aa(e,h);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=d}pa(ed,lb);var fd,gd=!z||hb("9");!Wa&&!z||z&&hb("9")||Wa&&hb("1.9.1");z&&hb("9");function hd(a,b){var d;d=(d=a.className)&&typeof d.split=="function"?d.split(/\s+/):[];var e=Na(arguments,1),f;f=d;for(var g=0,i=0;i<e.length;i++)Ia(f,e[i])>=0||(f.push(e[i]),g++);f=g==e.length;a.className=d.join(" ");return f};function id(a,b){this.x=u(a)?a:0;this.y=u(b)?b:0}id.prototype.Ka=function(){return new id(this.x,this.y)};id.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function jd(a){return a?new kd(ld(a)):fd||(fd=new kd)}function md(a){return x(a)?document.getElementById(a):a}function nd(a,b){Fb(b,function(b,e){e=="style"?a.style.cssText=b:e=="class"?a.className=b:e=="for"?a.htmlFor=b:e in od?a.setAttribute(od[e],b):a[e]=b})}var od={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",maxlength:"maxLength",type:"type"};
+function pd(a,b,d,e){function f(d){d&&b.appendChild(x(d)?a.createTextNode(d):d)}for(;e<d.length;e++){var g=d[e];ea(g)&&!(ha(g)&&g.nodeType>0)?Ja(qd(g)?Ma(g):g,f):f(g)}}function rd(a,b){pd(ld(a),a,arguments,1)}function ld(a){return a.nodeType==9?a:a.ownerDocument||a.document}function qd(a){if(a&&typeof a.length=="number")if(ha(a))return typeof a.item=="function"||typeof a.item=="string";else if(ga(a))return typeof a.item=="function";return m}function kd(a){this.P=a||s.document||document}q=kd.prototype;
+q.Qa=function(a){return x(a)?this.P.getElementById(a):a};q.ka=function(a,b,d){var e=this.P,f=arguments,g=f[0],i=f[1];if(!gd&&i&&(i.name||i.type)){g=["<",g];i.name&&g.push(' name="',ta(i.name),'"');if(i.type){g.push(' type="',ta(i.type),'"');var l={};Mb(l,i);i=l;delete i.type}g.push(">");g=g.join("")}g=e.createElement(g);if(i)x(i)?g.className=i:t(i)=="array"?hd.apply(k,[g].concat(i)):nd(g,i);f.length>2&&pd(e,g,f,2);return g};q.createElement=function(a){return this.P.createElement(a)};
+q.createTextNode=function(a){return this.P.createTextNode(a)};q.appendChild=function(a,b){a.appendChild(b)};q.append=rd;function sd(a){var b;a:{b=ld(a);if(b.defaultView&&b.defaultView.getComputedStyle&&(b=b.defaultView.getComputedStyle(a,k))){b=b.position||b.getPropertyValue("position");break a}b=""}return b||(a.currentStyle?a.currentStyle.position:k)||a.style.position}
+function td(a){if(z)return a.offsetParent;for(var b=ld(a),d=sd(a),e=d=="fixed"||d=="absolute",a=a.parentNode;a&&a!=b;a=a.parentNode)if(d=sd(a),e=e&&d=="static"&&a!=b.documentElement&&a!=b.body,!e&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||d=="fixed"||d=="absolute"))return a;return k}
+function ud(a){var b,d=ld(a),e=sd(a),f=Wa&&d.getBoxObjectFor&&!a.getBoundingClientRect&&e=="absolute"&&(b=d.getBoxObjectFor(a))&&(b.screenX<0||b.screenY<0),g=new id(0,0),i;b=d?d.nodeType==9?d:ld(d):document;if(i=z)if(i=!hb(9))i=jd(b).P.compatMode!="CSS1Compat";i=i?b.body:b.documentElement;if(a!=i)if(a.getBoundingClientRect){b=a.getBoundingClientRect();if(z)a=a.ownerDocument,b.left-=a.documentElement.clientLeft+a.body.clientLeft,b.top-=a.documentElement.clientTop+a.body.clientTop;a=jd(d).P;d=!Xa&&
+a.compatMode=="CSS1Compat"?a.documentElement:a.body;a=a.parentWindow||a.defaultView;d=new id(a.pageXOffset||d.scrollLeft,a.pageYOffset||d.scrollTop);g.x=b.left+d.x;g.y=b.top+d.y}else if(d.getBoxObjectFor&&!f)b=d.getBoxObjectFor(a),d=d.getBoxObjectFor(i),g.x=b.screenX-d.screenX,g.y=b.screenY-d.screenY;else{b=a;do{g.x+=b.offsetLeft;g.y+=b.offsetTop;b!=a&&(g.x+=b.clientLeft||0,g.y+=b.clientTop||0);if(Xa&&sd(b)=="fixed"){g.x+=d.body.scrollLeft;g.y+=d.body.scrollTop;break}b=b.offsetParent}while(b&&b!=
+a);if(Va||Xa&&e=="absolute")g.y-=d.body.offsetTop;for(b=a;(b=td(b))&&b!=d.body&&b!=i;)if(g.x-=b.scrollLeft,!Va||b.tagName!="TR")g.y-=b.scrollTop}return g.y};function vd(a,b,d){var a=a?ta(a):"",e='javascript:"'+encodeURI(a)+'"';b||(b={});var a=d||window,d=typeof e.href!="undefined"?e.href:String(e),e=b.target||e.target,f=[],g;for(g in b)switch(g){case "width":case "height":case "top":case "left":f.push(g+"="+b[g]);break;case "target":case "noreferrer":break;default:f.push(g+"="+(b[g]?1:0))}g=f.join(",");if(b.noreferrer){if(g=a.open("",e,g))z&&d.indexOf(";")!=-1&&(d="'"+d.replace(/'/g,"%27")+"'"),d=ta(d),g.document.write('<META HTTP-EQUIV="refresh" content="0; url='+
+d+'">'),g.document.close()}else g=a.open(d,e,g);return g};function D(a){return a!=k&&a!==m}function wd(a,b){var d=a[t.call(k,b)];return D(d)?d:(d=a._,D(d)?d:m)}function E(a,b){return Error.call(k,"No protocol method "+a+" defined for type "+t.call(k,b)+": "+b)}function xd(a){return Array.prototype.slice.call(a)}function yd(a){return Array.prototype.slice.call(arguments)}function F(a){if(D(D(a)?a.B:a))a=a.B(a);else{var b;var d=F[t.call(k,a)];D(d)?b=d:(d=F._,D(d)?b=d:c(E.call(k,"ICounted.-count",a)));a=b.call(k,a)}return a}
+function zd(a,b){var d;if(D(D(a)?a.u:a))d=a.u(a,b);else{var e=zd[t.call(k,a)];D(e)?d=e:(e=zd._,D(e)?d=e:c(E.call(k,"ICollection.-conj",a)));d=d.call(k,a,b)}return d}
+var G=function(){return function(a,b,d){switch(arguments.length){case 2:var e;if(D(D(a)?a.ja:a))e=a.ja(a,b);else{var f=G[t.call(k,a)];D(f)?e=f:(f=G._,D(f)?e=f:c(E.call(k,"IIndexed.-nth",a)));e=e.call(k,a,b)}return e;case 3:return D(D(a)?a.ja:a)?e=a.ja(a,b,d):(e=G[t.call(k,a)],D(e)?f=e:(e=G._,D(e)?f=e:c(E.call(k,"IIndexed.-nth",a))),e=f.call(k,a,b,d)),e}c("Invalid arity: "+arguments.length)}}(),Ad={};
+function Bd(a){if(D(D(a)?a.L:a))a=a.L(a);else{var b;var d=Bd[t.call(k,a)];D(d)?b=d:(d=Bd._,D(d)?b=d:c(E.call(k,"ISeq.-first",a)));a=b.call(k,a)}return a}function Cd(a){if(D(D(a)?a.M:a))a=a.M(a);else{var b;var d=Cd[t.call(k,a)];D(d)?b=d:(d=Cd._,D(d)?b=d:c(E.call(k,"ISeq.-rest",a)));a=b.call(k,a)}return a}
+var H=function(){return function(a,b,d){switch(arguments.length){case 2:var e;if(D(D(a)?a.K:a))e=a.K(a,b);else{var f=H[t.call(k,a)];D(f)?e=f:(f=H._,D(f)?e=f:c(E.call(k,"ILookup.-lookup",a)));e=e.call(k,a,b)}return e;case 3:return D(D(a)?a.K:a)?e=a.K(a,b,d):(e=H[t.call(k,a)],D(e)?f=e:(e=H._,D(e)?f=e:c(E.call(k,"ILookup.-lookup",a))),e=f.call(k,a,b,d)),e}c("Invalid arity: "+arguments.length)}}();
+function Dd(a,b,d){if(D(D(a)?a.ia:a))a=a.ia(a,b,d);else{var e;var f=Dd[t.call(k,a)];D(f)?e=f:(f=Dd._,D(f)?e=f:c(E.call(k,"IAssociative.-assoc",a)));a=e.call(k,a,b,d)}return a}var Ed={},Fd={};function Gd(a){if(D(D(a)?a.ab:a))a=a.state;else{var b;var d=Gd[t.call(k,a)];D(d)?b=d:(d=Gd._,D(d)?b=d:c(E.call(k,"IDeref.-deref",a)));a=b.call(k,a)}return a}var Hd={};
+function Id(a){if(D(D(a)?a.v:a))a=a.d;else{var b;var d=Id[t.call(k,a)];D(d)?b=d:(d=Id._,D(d)?b=d:c(E.call(k,"IMeta.-meta",a)));a=b.call(k,a)}return a}function Jd(a,b){var d;if(D(D(a)?a.w:a))d=a.w(a,b);else{var e=Jd[t.call(k,a)];D(e)?d=e:(e=Jd._,D(e)?d=e:c(E.call(k,"IWithMeta.-with-meta",a)));d=d.call(k,a,b)}return d}
+var Kd=function(){return function(a,b,d){switch(arguments.length){case 2:var e;if(D(D(a)?a.Y:a))e=a.Y(a,b);else{var f=Kd[t.call(k,a)];D(f)?e=f:(f=Kd._,D(f)?e=f:c(E.call(k,"IReduce.-reduce",a)));e=e.call(k,a,b)}return e;case 3:return D(D(a)?a.Y:a)?e=a.Y(a,b,d):(e=Kd[t.call(k,a)],D(e)?f=e:(e=Kd._,D(e)?f=e:c(E.call(k,"IReduce.-reduce",a))),e=f.call(k,a,b,d)),e}c("Invalid arity: "+arguments.length)}}();
+function Ld(a,b){var d;if(D(D(a)?a.i:a))d=a.i(a,b);else{var e=Ld[t.call(k,a)];D(e)?d=e:(e=Ld._,D(e)?d=e:c(E.call(k,"IEquiv.-equiv",a)));d=d.call(k,a,b)}return d}function Md(a){if(D(D(a)?a.o:a))a=a.o(a);else{var b;var d=Md[t.call(k,a)];D(d)?b=d:(d=Md._,D(d)?b=d:c(E.call(k,"IHash.-hash",a)));a=b.call(k,a)}return a}function Nd(a){if(D(D(a)?a.r:a))a=a.r(a);else{var b;var d=Nd[t.call(k,a)];D(d)?b=d:(d=Nd._,D(d)?b=d:c(E.call(k,"ISeqable.-seq",a)));a=b.call(k,a)}return a}var Od={},Pd={};
+function Qd(a,b){var d;if(D(D(a)?a.m:a))d=a.m(a,b);else{var e=Qd[t.call(k,a)];D(e)?d=e:(e=Qd._,D(e)?d=e:c(E.call(k,"IPrintable.-pr-seq",a)));d=d.call(k,a,b)}return d}function Rd(a,b,d){if(D(D(a)?a.Ja:a))a=a.Ja(a,b,d);else{var e;var f=Rd[t.call(k,a)];D(f)?e=f:(f=Rd._,D(f)?e=f:c(E.call(k,"IWatchable.-notify-watches",a)));a=e.call(k,a,b,d)}return a}function Sd(a,b){return a===b}function I(a,b){return Ld.call(k,a,b)}function J(a){return Sd.call(k,a,k)}Ld["null"]=function(a,b){return J.call(k,b)};
+zd["null"]=function(a,b){return K.call(k,b)};Ad["null"]=j;Bd["null"]=p(k);Cd["null"]=function(){return K.call(k)};Jd["null"]=p(k);Ed["null"]=j;G["null"]=function(){return function(a,b,d){switch(arguments.length){case 2:return k;case 3:return d}c("Invalid arity: "+arguments.length)}}();Hd["null"]=j;Id["null"]=p(k);Kd["null"]=function(){return function(a,b,d){switch(arguments.length){case 2:return b.call(k);case 3:return d}c("Invalid arity: "+arguments.length)}}();Md["null"]=p(0);F["null"]=p(0);
+Dd["null"]=function(a,b,d){return Td.call(k,b,d)};H["null"]=function(){return function(a,b,d){switch(arguments.length){case 2:return k;case 3:return d}c("Invalid arity: "+arguments.length)}}();Date.prototype.i=function(a,b){return Sd.call(k,a.toString(),b.toString())};Md.number=aa();Ld.number=function(a,b){return Sd.call(k,a,b)};Md["function"]=function(a){return y.call(k,a)};function Ud(a){return a+1}
+var Vd=function(){return function(a,b,d,e){switch(arguments.length){case 2:var f;a:if(D(I.call(k,0,F.call(k,a))))f=b.call(k);else for(var g=G.call(k,a,0),i=1;;)if(D(i<F.call(k,a)))g=b.call(k,g,G.call(k,a,i)),i+=1;else{f=g;break a}return f;case 3:a:{f=d;for(i=0;;)if(D(i<F.call(k,a)))f=b.call(k,f,G.call(k,a,i)),i+=1;else{g=f;break a}}return g;case 4:a:{f=d;for(g=e;;)if(D(g<F.call(k,a)))f=b.call(k,f,G.call(k,a,g)),g+=1;else{i=f;break a}}return i}c("Invalid arity: "+arguments.length)}}();
+function Wd(a,b){this.X=a;this.R=b}q=Wd.prototype;q.o=function(a){return Xd.call(k,a)};q.Y=function(){return function(a,b,d){switch(arguments.length){case 2:return Vd.call(k,a,b,this.X[this.R],this.R+1);case 3:return Vd.call(k,a,b,d,this.R)}c("Invalid arity: "+arguments.length)}}();q.i=function(a,b){return Yd.call(k,a,b)};q.N=j;q.B=function(){return this.X.length};q.Z=j;q.L=function(){return this.X[this.R]};q.M=function(){return D(this.R+1<this.X.length)?new Wd(this.X,this.R+1):K.call(k)};q.r=aa();
+function Zd(a,b){return D(I.call(k,0,a.length))?k:new Wd(a,b)}function L(a,b){return Zd.call(k,a,b)}Kd.array=function(){return function(a,b,d){switch(arguments.length){case 2:return Vd.call(k,a,b);case 3:return Vd.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}();H.array=function(){return function(a,b,d){switch(arguments.length){case 2:return a[b];case 3:return G.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}();
+G.array=function(){return function(a,b,d){switch(arguments.length){case 2:return D(b<a.length)?a[b]:k;case 3:return D(b<a.length)?a[b]:d}c("Invalid arity: "+arguments.length)}}();F.array=function(a){return a.length};Nd.array=function(a){return L.call(k,a,0)};function M(a){return D(a)?Nd.call(k,a):k}function N(a){a=M.call(k,a);return D(a)?Bd.call(k,a):k}function O(a){return Cd.call(k,M.call(k,a))}function Q(a){return D(a)?M.call(k,O.call(k,a)):k}function $d(a){return N.call(k,Q.call(k,a))}
+function ae(a){return Q.call(k,Q.call(k,a))}F._=function(a){for(var a=M.call(k,a),b=0;;)if(D(a))a=Q.call(k,a),b+=1;else return b};Ld._=function(a,b){return Sd.call(k,a,b)};function R(a){return D(a)?m:j}
+var be=function(){var a=k,b=function(){function b(a,d,i){var l=k;u(i)&&(l=L(Array.prototype.slice.call(arguments,2),0));return e.call(this,a,d,l)}function e(b,d,e){for(;;)if(D(e))b=a.call(k,b,d),d=N.call(k,e),e=Q.call(k,e);else return a.call(k,b,d)}b.b=2;b.a=function(a){var b=N(a),d=N(Q(a)),a=O(Q(a));return e.call(this,b,d,a)};return b}(),a=function(a,e,f){switch(arguments.length){case 2:return zd.call(k,a,e);default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=2;a.a=
+b.a;return a}();function ce(a){return F.call(k,a)}
+var S=function(){return function(a,b,d){switch(arguments.length){case 2:return G.call(k,a,b);case 3:return G.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}(),U=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,a,b);case 3:return H.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}(),de=function(){var a=k,b=function(){function b(a,d,i,l){var n=k;u(l)&&(n=L(Array.prototype.slice.call(arguments,3),0));return e.call(this,a,d,i,n)}function e(b,d,e,l){for(;;)if(b=
+a.call(k,b,d,e),D(l))d=N.call(k,l),e=$d.call(k,l),l=ae.call(k,l);else return b}b.b=3;b.a=function(a){var b=N(a),d=N(Q(a)),l=N(Q(Q(a))),a=O(Q(Q(a)));return e.call(this,b,d,l,a)};return b}(),a=function(a,e,f,g){switch(arguments.length){case 3:return Dd.call(k,a,e,f);default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=3;a.a=b.a;return a}();function ee(a,b){return Jd.call(k,a,b)}
+function fe(a){var b;D(a)?(b=a.p,b=D(b)?R.call(k,a.hasOwnProperty("cljs$core$IMeta$")):b):b=a;b=D(b)?j:wd.call(k,Hd,a);return D(b)?Id.call(k,a):k}function ge(a){return Md.call(k,a)}function he(a){var b;D(a)?(b=a.N,b=D(b)?R.call(k,a.hasOwnProperty("cljs$core$ISequential$")):b):b=a;return D(b)?j:wd.call(k,Od,a)}function ie(a){if(D(J.call(k,a)))a=m;else{var b;D(a)?(b=a.Ia,b=D(b)?R.call(k,a.hasOwnProperty("cljs$core$IMap$")):b):b=a;a=D(b)?j:wd.call(k,Ed,a)}return a}
+function je(a){var b;D(a)?(b=a.bb,b=D(b)?R.call(k,a.hasOwnProperty("cljs$core$IVector$")):b):b=a;return D(b)?j:wd.call(k,Fd,a)}function ke(a){var b=yd.call(k);Fb.call(k,a,function(a,e){return b.push(e)});return b}function le(a){return h===a}function me(a,b){return b instanceof a}function ne(a){if(D(J.call(k,a)))a=m;else{var b;D(a)?(b=a.Z,b=D(b)?R.call(k,a.hasOwnProperty("cljs$core$ISeq$")):b):b=a;a=D(b)?j:wd.call(k,Ad,a)}return a}function oe(a){return D(a)?j:m}
+function pe(a){var b=x.call(k,a);return D(b)?R.call(k,function(){var b=I.call(k,a.charAt(0),"\ufdd0");return D(b)?b:I.call(k,a.charAt(0),"\ufdd1")}()):b}function qe(a){var b=x.call(k,a);return D(b)?I.call(k,a.charAt(0),"\ufdd0"):b}function re(a){var b=x.call(k,a);return D(b)?I.call(k,a.charAt(0),"\ufdd1"):b}function se(a){return fa.call(k,a)}function te(a){return ga.call(k,a)}
+var ue=function(){return function(a,b,d){switch(arguments.length){case 2:return Kd.call(k,b,a);case 3:return Kd.call(k,d,a,b)}c("Invalid arity: "+arguments.length)}}(),ve=function(){return function(a,b,d){switch(arguments.length){case 2:var e=M.call(k,b);return D(e)?ue.call(k,a,N.call(k,e),Q.call(k,e)):a.call(k);case 3:a:for(var f=b,g=M.call(k,d);;)if(D(g))f=a.call(k,f,N.call(k,g)),g=Q.call(k,g);else{e=f;break a}return e}c("Invalid arity: "+arguments.length)}}();
+Kd._=function(){return function(a,b,d){switch(arguments.length){case 2:return ve.call(k,b,a);case 3:return ve.call(k,b,d,a)}c("Invalid arity: "+arguments.length)}}();function we(a){return a-1}function xe(a,b){for(var d=b,e=M.call(k,a);;){var f=e;if(D(D(f)?d>0:f))d-=1,e=Q.call(k,e);else return e}}
+G._=function(){return function(a,b,d){switch(arguments.length){case 2:var e;var f=xe.call(k,a,b);D(f)?e=N.call(k,f):c(Error("Index out of bounds"));return e;case 3:return e=xe.call(k,a,b),D(e)?N.call(k,e):d}c("Invalid arity: "+arguments.length)}}();
+var V=function(){var a=k,b=function(){function b(a,d){var i=k;u(d)&&(i=L(Array.prototype.slice.call(arguments,1),0));return e.call(this,a,i)}function e(b,d){return function(b,d){for(;;)if(D(d))var e=b.append(a.call(k,N.call(k,d))),f=Q.call(k,d),b=e,d=f;else return a.call(k,b)}.call(k,new Tc(a.call(k,b)),d)}b.b=1;b.a=function(a){var b=N(a),a=O(a);return e.call(this,b,a)};return b}(),a=function(a,e){switch(arguments.length){case 0:return"";case 1:return D(J.call(k,a))?"":a.toString();default:return b.apply(this,
+arguments)}c("Invalid arity: "+arguments.length)};a.b=1;a.a=b.a;return a}(),ye=function(){return function(a,b,d){switch(arguments.length){case 2:return a.substring(b);case 3:return a.substring(b,d)}c("Invalid arity: "+arguments.length)}}();
+function Yd(a,b){return oe.call(k,D(he.call(k,b))?function(){for(var d=M.call(k,a),e=M.call(k,b);;)if(D(J.call(k,d)))return J.call(k,e);else if(D(J.call(k,e)))return m;else if(D(I.call(k,N.call(k,d),N.call(k,e))))d=Q.call(k,d),e=Q.call(k,e);else return D("\ufdd0'else")?m:k}():k)}function ze(a,b){return a^b+2654435769+(a<<6)+(a>>2)}function Xd(a){return ue.call(k,function(a,d){return ze.call(k,a,ge.call(k,d))},ge.call(k,N.call(k,a)),Q.call(k,a))}
+function Ae(a,b,d,e){this.d=a;this.$=b;this.V=d;this.n=e}q=Ae.prototype;q.i=function(a,b){return Yd.call(k,a,b)};q.u=function(a,b){return new Ae(this.d,b,a,this.n+1)};q.Z=j;q.L=o("$");q.M=o("V");q.r=aa();q.w=function(a,b){return new Ae(b,this.$,this.V,this.n)};q.p=j;q.v=o("d");q.o=function(a){return Xd.call(k,a)};q.B=o("n");q.N=j;function Be(a){this.d=a}q=Be.prototype;q.i=function(a,b){return Yd.call(k,a,b)};q.u=function(a,b){return new Ae(this.d,b,k,1)};q.Z=j;q.L=p(k);q.M=p(k);q.r=p(k);
+q.w=function(a,b){return new Be(b)};q.p=j;q.v=o("d");q.o=function(a){return Xd.call(k,a)};q.B=p(0);q.N=j;var Ce=new Be(k);function De(a){return ue.call(k,be,Ce,a)}var K=function(){function a(a){var d=k;u(a)&&(d=L(Array.prototype.slice.call(arguments,0),0));return ue.call(k,be,Ce,De.call(k,d))}a.b=0;a.a=function(a){a=M(a);return ue.call(k,be,Ce,De.call(k,a))};return a}();function Ee(a,b,d){this.d=a;this.$=b;this.V=d}q=Ee.prototype;q.r=aa();q.o=function(a){return Xd.call(k,a)};
+q.i=function(a,b){return Yd.call(k,a,b)};q.N=j;q.u=function(a,b){return new Ee(k,b,a)};q.Z=j;q.L=o("$");q.M=function(){return D(J.call(k,this.V))?Ce:this.V};q.p=j;q.v=o("d");q.w=function(a,b){return new Ee(b,this.$,this.V)};function W(a,b){return new Ee(k,a,b)}Kd.string=function(){return function(a,b,d){switch(arguments.length){case 2:return Vd.call(k,a,b);case 3:return Vd.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}();
+H.string=function(){return function(a,b,d){switch(arguments.length){case 2:return G.call(k,a,b);case 3:return G.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}();G.string=function(){return function(a,b,d){switch(arguments.length){case 2:return D(b<F.call(k,a))?a.charAt(b):k;case 3:return D(b<F.call(k,a))?a.charAt(b):d}c("Invalid arity: "+arguments.length)}}();F.string=function(a){return a.length};Nd.string=function(a){return Zd.call(k,a,0)};Md.string=function(a){return Ea.call(k,a)};
+String.prototype.call=function(){return function(a,b,d){switch(arguments.length){case 2:return U.call(k,b,this.toString());case 3:return U.call(k,b,this.toString(),d)}c("Invalid arity: "+arguments.length)}}();String.prototype.apply=function(a,b){return D(ce.call(k,b)<2)?U.call(k,b[0],a):U.call(k,b[0],a,b[1])};function Fe(a){var b=a.x;return D(a.Ga)?b:(a.x=b.call(k),a.Ga=j,a.x)}function X(a,b,d){this.d=a;this.Ga=b;this.x=d}q=X.prototype;q.r=function(a){return M.call(k,Fe.call(k,a))};
+q.o=function(a){return Xd.call(k,a)};q.i=function(a,b){return Yd.call(k,a,b)};q.N=j;q.u=function(a,b){return W.call(k,b,a)};q.Z=j;q.L=function(a){return N.call(k,Fe.call(k,a))};q.M=function(a){return O.call(k,Fe.call(k,a))};q.p=j;q.v=o("d");q.w=function(a,b){return new X(b,this.Ga,this.x)};function Ge(a){for(var b=yd.call(k);;)if(D(M.call(k,a)))b.push(N.call(k,a)),a=Q.call(k,a);else return b}
+function He(a,b){for(var d=a,e=b,f=0;;){var g;g=e>0;g=D(g)?M.call(k,d):g;if(D(g))d=Q.call(k,d),e-=1,f+=1;else return f}}
+var Je=function Ie(b){return D(J.call(k,b))?k:D(J.call(k,Q.call(k,b)))?M.call(k,N.call(k,b)):D("\ufdd0'else")?W.call(k,N.call(k,b),Ie.call(k,Q.call(k,b))):k},Ke=function(){function a(a,b){return new X(k,m,function(){var d=M.call(k,a);return D(d)?W.call(k,N.call(k,d),e.call(k,O.call(k,d),b)):b})}function b(a){return new X(k,m,function(){return a})}function d(){return new X(k,m,p(k))}var e=k,f=function(){function a(d,e,f){var g=k;u(f)&&(g=L(Array.prototype.slice.call(arguments,2),0));return b.call(this,
+d,e,g)}function b(a,d,f){return function w(a,b){return new X(k,m,function(){var d=M.call(k,a);return D(d)?W.call(k,N.call(k,d),w.call(k,O.call(k,d),b)):D(b)?w.call(k,N.call(k,b),Q.call(k,b)):k})}.call(k,e.call(k,a,d),f)}a.b=2;a.a=function(a){var d=N(a),e=N(Q(a)),a=O(Q(a));return b.call(this,d,e,a)};return a}(),e=function(e,i,l){switch(arguments.length){case 0:return d.call(this);case 1:return b.call(this,e);case 2:return a.call(this,e,i);default:return f.apply(this,arguments)}c("Invalid arity: "+
+arguments.length)};e.b=2;e.a=f.a;return e}(),Le=function(){var a=k,b=function(){function a(d,g,i,l,n){var r=k;u(n)&&(r=L(Array.prototype.slice.call(arguments,4),0));return b.call(this,d,g,i,l,r)}function b(a,d,e,l,n){return W.call(k,a,W.call(k,d,W.call(k,e,W.call(k,l,Je.call(k,n)))))}a.b=4;a.a=function(a){var d=N(a),i=N(Q(a)),l=N(Q(Q(a))),n=N(Q(Q(Q(a)))),a=O(Q(Q(Q(a))));return b.call(this,d,i,l,n,a)};return a}(),a=function(a,e,f,g,i){switch(arguments.length){case 1:return M.call(k,a);case 2:return W.call(k,
+a,e);case 3:return W.call(k,a,W.call(k,e,f));case 4:return W.call(k,a,W.call(k,e,W.call(k,f,g)));default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=4;a.a=b.a;return a}(),Y=function(){var a=k,b=function(){function a(d,g,i,l,n,r){var v=k;u(r)&&(v=L(Array.prototype.slice.call(arguments,5),0));return b.call(this,d,g,i,l,n,v)}function b(a,d,e,l,n,r){d=W.call(k,d,W.call(k,e,W.call(k,l,W.call(k,n,Je.call(k,r)))));e=a.b;return D(a.a)?D(He.call(k,d,e)<=e)?a.apply(a,Ge.call(k,
+d)):a.a(d):a.apply(a,Ge.call(k,d))}a.b=5;a.a=function(a){var d=N(a),i=N(Q(a)),l=N(Q(Q(a))),n=N(Q(Q(Q(a)))),r=N(Q(Q(Q(Q(a))))),a=O(Q(Q(Q(Q(a)))));return b.call(this,d,i,l,n,r,a)};return a}(),a=function(a,e,f,g,i,l){switch(arguments.length){case 2:var n=a,r=e,v=n.b;return D(n.a)?D(He.call(k,r,v+1)<=v)?n.apply(n,Ge.call(k,r)):n.a(r):n.apply(n,Ge.call(k,r));case 3:return n=a,r=Le.call(k,e,f),v=n.b,D(n.a)?D(He.call(k,r,v)<=v)?n.apply(n,Ge.call(k,r)):n.a(r):n.apply(n,Ge.call(k,r));case 4:return n=a,r=Le.call(k,
+e,f,g),v=n.b,D(n.a)?D(He.call(k,r,v)<=v)?n.apply(n,Ge.call(k,r)):n.a(r):n.apply(n,Ge.call(k,r));case 5:return n=a,r=Le.call(k,e,f,g,i),v=n.b,D(n.a)?D(He.call(k,r,v)<=v)?n.apply(n,Ge.call(k,r)):n.a(r):n.apply(n,Ge.call(k,r));default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=5;a.a=b.a;return a}(),Me=function(){var a=k,b=function(){function a(b,d,g){var i=k;u(g)&&(i=L(Array.prototype.slice.call(arguments,2),0));return R.call(k,Y.call(k,I,b,d,i))}a.b=2;a.a=function(a){var b=
+N(a),d=N(Q(a)),a=O(Q(a));return R.call(k,Y.call(k,I,b,d,a))};return a}(),a=function(a,e,f){switch(arguments.length){case 1:return m;case 2:return R.call(k,I.call(k,a,e));default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=2;a.a=b.a;return a}();function Ne(a,b){for(;;)if(D(J.call(k,M.call(k,b))))return j;else if(D(a.call(k,N.call(k,b))))var d=a,e=Q.call(k,b),a=d,b=e;else return D("\ufdd0'else")?m:k}function Oe(a){return a}
+function Pe(a){return function(){var b=k,d=function(){function b(d,e,i){var l=k;u(i)&&(l=L(Array.prototype.slice.call(arguments,2),0));return R.call(k,Y.call(k,a,d,e,l))}b.b=2;b.a=function(b){var d=N(b),e=N(Q(b)),b=O(Q(b));return R.call(k,Y.call(k,a,d,e,b))};return b}(),b=function(b,f,g){switch(arguments.length){case 0:return R.call(k,a.call(k));case 1:return R.call(k,a.call(k,b));case 2:return R.call(k,a.call(k,b,f));default:return d.apply(this,arguments)}c("Invalid arity: "+arguments.length)};b.b=
+2;b.a=d.a;return b}()}function Qe(a){return function(){function b(b){u(b)&&L(Array.prototype.slice.call(arguments,0),0);return a}b.b=0;b.a=function(b){M(b);return a};return b}()}function Re(a,b){return function e(b,g){return new X(k,m,function(){var i=M.call(k,g);return D(i)?W.call(k,a.call(k,b,N.call(k,i)),e.call(k,b+1,O.call(k,i))):k})}.call(k,0,b)}
+var Z=function(){function a(a,b,d,f){return new X(k,m,function(){var r=M.call(k,b),v=M.call(k,d),w=M.call(k,f);return D(D(r)?D(v)?w:v:r)?W.call(k,a.call(k,N.call(k,r),N.call(k,v),N.call(k,w)),e.call(k,a,O.call(k,r),O.call(k,v),O.call(k,w))):k})}function b(a,b,d){return new X(k,m,function(){var f=M.call(k,b),r=M.call(k,d);return D(D(f)?r:f)?W.call(k,a.call(k,N.call(k,f),N.call(k,r)),e.call(k,a,O.call(k,f),O.call(k,r))):k})}function d(a,b){return new X(k,m,function(){var d=M.call(k,b);return D(d)?W.call(k,
+a.call(k,N.call(k,d)),e.call(k,a,O.call(k,d))):k})}var e=k,f=function(){function a(d,e,f,g,w){var P=k;u(w)&&(P=L(Array.prototype.slice.call(arguments,4),0));return b.call(this,d,e,f,g,P)}function b(a,d,f,g,i){return e.call(k,function(b){return Y.call(k,a,b)},function T(a){return new X(k,m,function(){var b=e.call(k,M,a);return D(Ne.call(k,Oe,b))?W.call(k,e.call(k,N,b),T.call(k,e.call(k,O,b))):k})}.call(k,be.call(k,i,g,f,d)))}a.b=4;a.a=function(a){var d=N(a),e=N(Q(a)),f=N(Q(Q(a))),g=N(Q(Q(Q(a)))),a=
+O(Q(Q(Q(a))));return b.call(this,d,e,f,g,a)};return a}(),e=function(e,i,l,n,r){switch(arguments.length){case 2:return d.call(this,e,i);case 3:return b.call(this,e,i,l);case 4:return a.call(this,e,i,l,n);default:return f.apply(this,arguments)}c("Invalid arity: "+arguments.length)};e.b=4;e.a=f.a;return e}(),Te=function Se(b,d){return new X(k,m,function(){if(D(b>0)){var e=M.call(k,d);return D(e)?W.call(k,N.call(k,e),Se.call(k,b-1,O.call(k,e))):k}else return k})};
+function Ue(a,b){function d(a,b){for(;;){var d=M.call(k,b),i=a>0;if(D(D(i)?d:i))i=a-1,d=O.call(k,d),a=i,b=d;else return d}}return new X(k,m,function(){return d.call(k,a,b)})}
+var Ve=function(){function a(a){return new X(k,m,function(){return W.call(k,a,b.call(k,a))})}var b=k;return b=function(d,e){switch(arguments.length){case 1:return a.call(this,d);case 2:return Te.call(k,d,b.call(k,e))}c("Invalid arity: "+arguments.length)}}(),We=function(){function a(a,d){return new X(k,m,function(){var g=M.call(k,a),i=M.call(k,d);return D(D(g)?i:g)?W.call(k,N.call(k,g),W.call(k,N.call(k,i),b.call(k,O.call(k,g),O.call(k,i)))):k})}var b=k,d=function(){function a(b,e,l){var n=k;u(l)&&
+(n=L(Array.prototype.slice.call(arguments,2),0));return d.call(this,b,e,n)}function d(a,e,f){return new X(k,m,function(){var d=Z.call(k,M,be.call(k,f,e,a));return D(Ne.call(k,Oe,d))?Ke.call(k,Z.call(k,N,d),Y.call(k,b,Z.call(k,O,d))):k})}a.b=2;a.a=function(a){var b=N(a),e=N(Q(a)),a=O(Q(a));return d.call(this,b,e,a)};return a}(),b=function(b,f,g){switch(arguments.length){case 2:return a.call(this,b,f);default:return d.apply(this,arguments)}c("Invalid arity: "+arguments.length)};b.b=2;b.a=d.a;return b}();
+function Xe(a,b){return Ue.call(k,1,We.call(k,Ve.call(k,a),b))}function Ye(a){return function d(a,f){return new X(k,m,function(){var g=M.call(k,a);return D(g)?W.call(k,N.call(k,g),d.call(k,O.call(k,g),f)):D(M.call(k,f))?d.call(k,N.call(k,f),O.call(k,f)):k})}.call(k,k,a)}
+var Ze=function(){var a=k,b=function(){function a(b,d,g){var i=k;u(g)&&(i=L(Array.prototype.slice.call(arguments,2),0));return Ye.call(k,Y.call(k,Z,b,d,i))}a.b=2;a.a=function(a){var b=N(a),d=N(Q(a)),a=O(Q(a));return Ye.call(k,Y.call(k,Z,b,d,a))};return a}(),a=function(a,e,f){switch(arguments.length){case 2:return Ye.call(k,Z.call(k,a,e));default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=2;a.a=b.a;return a}(),af=function $e(b,d){return new X(k,m,function(){var e=M.call(k,
+d);if(D(e)){var f=N.call(k,e),e=O.call(k,e);return D(b.call(k,f))?W.call(k,f,$e.call(k,b,e)):$e.call(k,b,e)}else return k})};function bf(a,b){return af.call(k,Pe.call(k,a),b)}function cf(a,b){return ue.call(k,zd,a,b)}
+var df=function(){function a(a,b,g,i){return new X(k,m,function(){var l=M.call(k,i);if(D(l)){var n=Te.call(k,a,l);return D(I.call(k,a,ce.call(k,n)))?W.call(k,n,d.call(k,a,b,g,Ue.call(k,b,l))):K.call(k,Te.call(k,a,Ke.call(k,n,g)))}else return k})}function b(a,b,g){return new X(k,m,function(){var i=M.call(k,g);if(D(i)){var l=Te.call(k,a,i);return D(I.call(k,a,ce.call(k,l)))?W.call(k,l,d.call(k,a,b,Ue.call(k,b,i))):k}else return k})}var d=k;return d=function(e,f,g,i){switch(arguments.length){case 2:return d.call(k,
+e,e,f);case 3:return b.call(this,e,f,g);case 4:return a.call(this,e,f,g,i)}c("Invalid arity: "+arguments.length)}}(),ef=function(){function a(a,e,f,g){var i=k;u(g)&&(i=L(Array.prototype.slice.call(arguments,3),0));return b.call(this,a,e,f,i)}function b(b,e,f,g){var i=S.call(k,e,0,k),e=xe.call(k,e,1);return D(e)?de.call(k,b,i,Y.call(k,a,U.call(k,b,i),e,f,g)):de.call(k,b,i,Y.call(k,f,U.call(k,b,i),g))}a.b=3;a.a=function(a){var e=N(a),f=N(Q(a)),g=N(Q(Q(a))),a=O(Q(Q(a)));return b.call(this,e,f,g,a)};
+return a}();function ff(a,b){this.d=a;this.h=b}q=ff.prototype;q.i=function(a,b){return Yd.call(k,a,b)};q.u=function(a,b){var d=xd.call(k,this.h);d.push(b);return new ff(this.d,d)};q.r=function(){var a=this;return D(a.h.length>0)?function d(e){return new X(k,m,function(){return D(e<a.h.length)?W.call(k,a.h[e],d.call(k,e+1)):k})}.call(k,0):k};q.bb=j;q.w=function(a,b){return new ff(b,this.h)};
+q.ja=function(){return function(a,b,d){switch(arguments.length){case 2:var e=0<=b;return D(D(e)?b<this.h.length:e)?this.h[b]:k;case 3:return e=0<=b,D(D(e)?b<this.h.length:e)?this.h[b]:d}c("Invalid arity: "+arguments.length)}}();q.p=j;q.v=o("d");q.Y=function(){return function(a,b,d){switch(arguments.length){case 2:return Vd.call(k,this.h,b);case 3:return Vd.call(k,this.h,b,d)}c("Invalid arity: "+arguments.length)}}();q.o=function(a){return Xd.call(k,a)};q.B=function(){return this.h.length};q.N=j;
+q.ia=function(a,b,d){a=xd.call(k,this.h);a[b]=d;return new ff(this.d,a)};q.K=function(){return function(a,b,d){switch(arguments.length){case 2:return G.call(k,a,b,k);case 3:return G.call(k,a,b,d)}c("Invalid arity: "+arguments.length)}}();var gf=new ff(k,yd.call(k));function hf(a){return new ff(k,a)}ff.prototype.call=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,this,b);case 3:return H.call(k,this,b,d)}c("Invalid arity: "+arguments.length)}}();
+function jf(a){return ue.call(k,be,gf,a)}var kf=function(){function a(a){var d=k;u(a)&&(d=L(Array.prototype.slice.call(arguments,0),0));return jf.call(k,d)}a.b=0;a.a=function(a){a=M(a);return jf.call(k,a)};return a}();function lf(){}lf.prototype.i=p(m);var mf=new lf;function nf(a,b){return oe.call(k,D(ie.call(k,b))?D(I.call(k,ce.call(k,a),ce.call(k,b)))?Ne.call(k,Oe,Z.call(k,function(a){return I.call(k,U.call(k,b,N.call(k,a),mf),$d.call(k,a))},a)):k:k)}
+function of(a,b,d){for(var e=d.length,f=0;;)if(D(f<e))if(D(I.call(k,b,d[f])))return f;else f+=a;else return k}var pf=function(){var a=k;return a=function(b,d,e,f){switch(arguments.length){case 2:return a.call(k,b,d,j,m);case 4:var g=x.call(k,b);return D(D(g)?d.hasOwnProperty(b):g)?e:f}c("Invalid arity: "+arguments.length)}}();function qf(a,b,d){this.d=a;this.keys=b;this.H=d}q=qf.prototype;q.i=function(a,b){return nf.call(k,a,b)};
+q.u=function(a,b){return D(je.call(k,b))?Dd.call(k,a,G.call(k,b,0),G.call(k,b,1)):ue.call(k,zd,a,b)};q.r=function(){var a=this;return D(a.keys.length>0)?Z.call(k,function(b){return kf.call(k,b,a.H[b])},a.keys):k};q.w=function(a,b){return new qf(b,this.keys,this.H)};q.Ia=j;q.p=j;q.v=o("d");q.o=function(a){return Xd.call(k,a)};q.B=function(){return this.keys.length};
+q.ia=function(a,b,d){if(D(x.call(k,b))){var a=Kb.call(k,this.H),e=a.hasOwnProperty(b);a[b]=d;return D(e)?new qf(this.d,this.keys,a):(d=xd.call(k,this.keys),d.push(b),new qf(this.d,d,a))}else return ee.call(k,cf.call(k,Td.call(k,b,d),M.call(k,a)),this.d)};q.K=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,a,b,k);case 3:return pf.call(k,b,this.H,this.H[b],d)}c("Invalid arity: "+arguments.length)}}();yd.call(k);function $(a,b){return new qf(k,a,b)}
+qf.prototype.call=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,this,b);case 3:return H.call(k,this,b,d)}c("Invalid arity: "+arguments.length)}}();function rf(a,b,d){this.d=a;this.n=b;this.F=d}q=rf.prototype;q.i=function(a,b){return nf.call(k,a,b)};q.u=function(a,b){return D(je.call(k,b))?Dd.call(k,a,G.call(k,b,0),G.call(k,b,1)):ue.call(k,zd,a,b)};
+q.r=function(){var a=this;if(D(a.n>0)){var b=ke.call(k,a.F);return Ze.call(k,function(b){return Z.call(k,jf,df.call(k,2,a.F[b]))},b)}else return k};q.w=function(a,b){return new rf(b,this.n,this.F)};q.Ia=j;q.p=j;q.v=o("d");q.o=function(a){return Xd.call(k,a)};q.B=o("n");
+q.ia=function(a,b,d){var a=ge.call(k,b),e=this.F[a];if(D(e)){var e=xd.call(k,e),f=Kb.call(k,this.F);f[a]=e;a=of.call(k,2,b,e);return D(a)?(e[a+1]=d,new rf(this.d,this.n,f)):(e.push(b,d),new rf(this.d,this.n+1,f))}else return e=Kb.call(k,this.F),e[a]=yd.call(k,b,d),new rf(this.d,this.n+1,e)};q.K=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,a,b,k);case 3:var e=this.F[ge.call(k,b)],f=D(e)?of.call(k,2,b,e):k;return D(f)?e[f+1]:d}c("Invalid arity: "+arguments.length)}}();
+var sf=new rf(k,0,function(){return{}}.call(k));function tf(a){for(var b=["\ufdd1'step"],d=b.length,e=0,f=sf;;)if(D(e<d))var g=e+1,f=de.call(k,f,b[e],a[e]),e=g;else return f}rf.prototype.call=function(){return function(a,b,d){switch(arguments.length){case 2:return H.call(k,this,b);case 3:return H.call(k,this,b,d)}c("Invalid arity: "+arguments.length)}}();
+var Td=function(){function a(a){var e=k;u(a)&&(e=L(Array.prototype.slice.call(arguments,0),0));return b.call(this,e)}function b(a){for(var a=M.call(k,a),b=sf;;)if(D(a))var f=ae.call(k,a),b=de.call(k,b,N.call(k,a),$d.call(k,a)),a=f;else return b}a.b=0;a.a=function(a){a=M(a);return b.call(this,a)};return a}();function uf(a){return M.call(k,Z.call(k,N,a))}function vf(a){return M.call(k,Z.call(k,$d,a))}Td.call(k);
+function wf(a){if(D(pe.call(k,a)))return a;else{var b;b=qe.call(k,a);b=D(b)?b:re.call(k,a);if(D(b))return b=a.lastIndexOf("/"),D(b<0)?ye.call(k,a,2):ye.call(k,a,b+1);else if(D("\ufdd0'else"))c(Error(V.call(k,"Doesn't support name: ",a)));else return k}}function xf(a){var b;b=qe.call(k,a);b=D(b)?b:re.call(k,a);if(D(b))return b=a.lastIndexOf("/"),D(b>-1)?ye.call(k,a,2,b):k;else c(Error(V.call(k,"Doesn't support namespace: ",a)))}
+function yf(a,b){for(var d=$([],{}),e=M.call(k,a),f=M.call(k,b);;){var g=e;if(D(D(g)?f:g))d=de.call(k,d,N.call(k,e),N.call(k,f)),e=Q.call(k,e),f=Q.call(k,f);else return d}}function zf(a,b){var d=a.exec(b);return D(J.call(k,d))?k:D(I.call(k,ce.call(k,d),1))?N.call(k,d):jf.call(k,d)}function Af(a,b,d,e,f,g){return Ke.call(k,hf([b]),Ye.call(k,Xe.call(k,hf([d]),Z.call(k,function(b){return a.call(k,b,f)},g))),hf([e]))}
+var Cf=function Bf(b,d){return D(J.call(k,b))?K.call(k,"nil"):D(le.call(k,b))?K.call(k,"#<undefined>"):D("\ufdd0'else")?Ke.call(k,D(function(){var e=U.call(k,d,"\ufdd0'meta");return D(e)?(D(b)?(e=b.p,e=D(e)?R.call(k,b.hasOwnProperty("cljs$core$IMeta$")):e):e=b,e=D(e)?j:wd.call(k,Hd,b),D(e)?fe.call(k,b):e):e}())?Ke.call(k,hf(["^"]),Bf.call(k,fe.call(k,b),d),hf([" "])):k,D(function(){var d;D(b)?(d=b.q,d=D(d)?R.call(k,b.hasOwnProperty("cljs$core$IPrintable$")):d):d=b;return D(d)?j:wd.call(k,Pd,b)}())?
+Qd.call(k,b,d):K.call(k,"#<",V.call(k,b),">")):k};function Df(a,b){var d=N.call(k,a),e=new Tc,f=M.call(k,a);if(D(f))for(var g=N.call(k,f);;){D(Sd.call(k,g,d))||e.append(" ");var i=M.call(k,Cf.call(k,g,b));if(D(i))for(g=N.call(k,i);;)if(e.append(g),g=Q.call(k,i),D(g))i=g,g=N.call(k,i);else break;f=Q.call(k,f);if(D(f))g=f,f=N.call(k,g),i=g,g=f,f=i;else break}return V.call(k,e)}
+function Ef(){return $(["\ufdd0'flush-on-newline","\ufdd0'readably","\ufdd0'meta","\ufdd0'dup"],{"\ufdd0'flush-on-newline":j,"\ufdd0'readably":j,"\ufdd0'meta":m,"\ufdd0'dup":m})}var Ff=function(){function a(a){var d=k;u(a)&&(d=L(Array.prototype.slice.call(arguments,0),0));return Df.call(k,d,Ef.call(k))}a.b=0;a.a=function(a){a=M(a);return Df.call(k,a,Ef.call(k))};return a}();rf.prototype.q=j;
+rf.prototype.m=function(a,b){return Af.call(k,function(a){return Af.call(k,Cf,""," ","",b,a)},"{",", ","}",b,a)};Pd.number=j;Qd.number=function(a){return K.call(k,V.call(k,a))};Wd.prototype.q=j;Wd.prototype.m=function(a,b){return Af.call(k,Cf,"("," ",")",b,a)};X.prototype.q=j;X.prototype.m=function(a,b){return Af.call(k,Cf,"("," ",")",b,a)};Pd["boolean"]=j;Qd["boolean"]=function(a){return K.call(k,V.call(k,a))};Pd.string=j;
+Qd.string=function(a,b){return D(qe.call(k,a))?K.call(k,V.call(k,":",function(){var b=xf.call(k,a);return D(b)?V.call(k,b,"/"):k}(),wf.call(k,a))):D(re.call(k,a))?K.call(k,V.call(k,function(){var b=xf.call(k,a);return D(b)?V.call(k,b,"/"):k}(),wf.call(k,a))):D("\ufdd0'else")?K.call(k,D("\ufdd0'readably".call(k,b))?Ba.call(k,a):a):k};ff.prototype.q=j;ff.prototype.m=function(a,b){return Af.call(k,Cf,"["," ","]",b,a)};Ae.prototype.q=j;Ae.prototype.m=function(a,b){return Af.call(k,Cf,"("," ",")",b,a)};
+Pd.array=j;Qd.array=function(a,b){return Af.call(k,Cf,"#<Array [",", ","]>",b,a)};Be.prototype.q=j;Be.prototype.m=function(){return K.call(k,"()")};Ee.prototype.q=j;Ee.prototype.m=function(a,b){return Af.call(k,Cf,"("," ",")",b,a)};qf.prototype.q=j;qf.prototype.m=function(a,b){return Af.call(k,function(a){return Af.call(k,Cf,""," ","",b,a)},"{",", ","}",b,a)};function Gf(a,b,d,e){this.state=a;this.d=b;this.nb=d;this.ob=e}q=Gf.prototype;
+q.Ja=function(a,b,d){var e=M.call(k,this.ob);if(D(e)){var f=N.call(k,e);S.call(k,f,0,k);for(S.call(k,f,1,k);;){var g=f,f=S.call(k,g,0,k),g=S.call(k,g,1,k);g.call(k,f,a,b,d);e=Q.call(k,e);if(D(e))f=e,e=N.call(k,f),g=f,f=e,e=g;else return k}}else return k};q.q=j;q.m=function(a,b){return Ke.call(k,hf(["#<Atom: "]),Qd.call(k,this.state,b),">")};q.p=j;q.v=o("d");q.ab=o("state");q.i=function(a,b){return Sd.call(k,a,b)};
+var Hf=function(){var a=k,b=function(){function a(d,g){var i=k;u(g)&&(i=L(Array.prototype.slice.call(arguments,1),0));return b.call(this,d,i)}function b(a,d){var e=D(ne.call(k,d))?Y.call(k,Td,d):d,l=U.call(k,e,"\ufdd0'validator"),e=U.call(k,e,"\ufdd0'meta");return new Gf(a,e,l,k)}a.b=1;a.a=function(a){var d=N(a),a=O(a);return b.call(this,d,a)};return a}(),a=function(a,e){switch(arguments.length){case 1:return new Gf(a,k,k,k);default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};
+a.b=1;a.a=b.a;return a}();function If(a,b){var d=a.nb;D(d)&&!D(d.call(k,b))&&c(V.call(k,"Assert failed: ","Validator rejected reference state","\n",Ff.call(k,K("\ufdd1'validate","\ufdd1'new-value"))));d=a.state;a.state=b;Rd.call(k,a,d,b);return b}
+var Jf=function(){var a=k,b=function(){function a(b,d,g,i,l,n){var r=k;u(n)&&(r=L(Array.prototype.slice.call(arguments,5),0));return If.call(k,b,Y.call(k,d,b.state,g,i,l,r))}a.b=5;a.a=function(a){var b=N(a),d=N(Q(a)),i=N(Q(Q(a))),l=N(Q(Q(Q(a)))),n=N(Q(Q(Q(Q(a))))),a=O(Q(Q(Q(Q(a)))));return If.call(k,b,Y.call(k,d,b.state,i,l,n,a))};return a}(),a=function(a,e,f,g,i,l){switch(arguments.length){case 2:return If.call(k,a,e.call(k,a.state));case 3:return If.call(k,a,e.call(k,a.state,f));case 4:return If.call(k,
+a,e.call(k,a.state,f,g));case 5:return If.call(k,a,e.call(k,a.state,f,g,i));default:return b.apply(this,arguments)}c("Invalid arity: "+arguments.length)};a.b=5;a.a=b.a;return a}();function Kf(a){return Gd.call(k,a)}Hf.call(k,function(){return $(["\ufdd0'parents","\ufdd0'descendants","\ufdd0'ancestors"],{"\ufdd0'parents":$([],{}),"\ufdd0'descendants":$([],{}),"\ufdd0'ancestors":$([],{})})}.call(k));var Lf=document.documentElement;function Mf(a,b){var d=b-a;return function(b){return a+b*d}}function Nf(a,b){var d=Lf.createSVGPoint();d.x=a;d.y=b;return d}function Of(a){var b=a.getBBox(),d=a.getCTM(),a=Nf.call(k,b.x,b.y).matrixTransform(d),b=Nf.call(k,b.x+b.width,b.y+b.height).matrixTransform(d);return $(["\ufdd0'x","\ufdd0'y","\ufdd0'width","\ufdd0'height"],{"\ufdd0'x":a.x,"\ufdd0'y":a.y,"\ufdd0'width":b.x-a.x,"\ufdd0'height":b.y-a.y})}
+function Pf(a,b){return Zd.call(k,a.getElementsByTagName(b),0)}function Qf(a){return ue.call(k,function(a,d){var e=d.getAttribute("duration");return D(e)?de.call(k,a,"\ufdd0'duration",parseFloat.call(k,e)):(e=d.getAttribute("i"),D(md.call(k,e))?ef.call(k,a,hf([e]),de,"\ufdd0'opacity",parseFloat.call(k,d.getAttribute("opacity"))):alert.call(k,V.call(k,"Couldn't find elem ",e)))},$([],{}),a)}
+function Rf(a){var b=Qf.call(k,Pf.call(k,N.call(k,Pf.call(k,a,"init")),"set")),d=Pf.call(k,a,"step"),a=hf([]);S.call(k,d,0,k);xe.call(k,d,1);for(var e=d;;){var f=a,g=b,d=e,i=S.call(k,d,0,k),d=xe.call(k,d,1);if(D(R.call(k,i)))return f;else var l=function(){var a=i.getAttribute("view");if(D(a))return Of.call(k,function(){var b=md.call(k,a);return D(b)?b:alert.call(k,V.call(k,"Couldn't find view ",a))}());else{var b="\ufdd0'view".call(k,g);return D(b)?b:alert.call(k,"First step requires a view attr")}}(),
+n=de.call(k,cf.call(k,g,Qf.call(k,Pf.call(k,i,"set"))),"\ufdd0'view",l),a=de.call(k,cf.call(k,g,Qf.call(k,bf.call(k,function(){return function(a){return a.getAttribute("once")}}(a,b,e),Pf.call(k,i,"set")))),"\ufdd0'view",l),b=be.call(k,f,n),f=a,a=b,b=f,e=d}}
+var Tf=function Sf(b,d){return D(se.call(k,b))?D(I.call(k,b,d))?b:Mf.call(k,b,d):yf.call(k,uf.call(k,b),Z.call(k,Sf,vf.call(k,b),vf.call(k,d)))},Vf=function Uf(b,d){return D(te.call(k,b))?b.call(k,d):D(ie.call(k,b))?yf.call(k,uf.call(k,b),Z.call(k,function(b){return Uf.call(k,b,d)},vf.call(k,b))):D("\ufdd0'else")?b:k};function Wf(a,b,d){return 0>(ce.call(k,b)-1<d.call(k,a)?ce.call(k,b)-1:d.call(k,a))?0:ce.call(k,b)-1<d.call(k,a)?ce.call(k,b)-1:d.call(k,a)}
+function Xf(a){a=M.call(k,a);if(D(a)){var b=N.call(k,a);S.call(k,b,0,k);for(S.call(k,b,1,k);;){var d=b,b=S.call(k,d,0,k),d=S.call(k,d,1,k);if(D(I.call(k,"\ufdd0'view",b))){var b=d,e=D(ne.call(k,b))?Y.call(k,Td,b):b,b=U.call(k,e,"\ufdd0'height"),d=U.call(k,e,"\ufdd0'width"),f=U.call(k,e,"\ufdd0'y"),e=U.call(k,e,"\ufdd0'x");Lf.setAttribute("viewBox",V.call(k,e,",",f,",",d,",",b))}else if(!D(I.call(k,"\ufdd0'duration",b))&&D("\ufdd0'else")&&(b=md.call(k,b),D("\ufdd0'opacity".call(k,d))))b.style.opacity=
+"\ufdd0'opacity".call(k,d);a=Q.call(k,a);if(D(a))b=a,a=N.call(k,b),d=b,b=a,a=d;else return k}}else return k}var Yf=Hf.call(k,k),Zf=Hf.call(k,k),$f=Hf.call(k,k),ag=Hf.call(k,0),bg=Hf.call(k,k);
+function cg(a){var a=Jf.call(k,ag,Wf,Kf.call(k,Zf),a),b=Kf.call(k,$f),d=S.call(k,Kf.call(k,Zf),a);return D(Me.call(k,b,d))?(document.location.hash=V.call(k,"#",Ff.call(k,tf([a]))),If.call(k,bg,ee.call(k,Tf.call(k,b,d),$(["\ufdd0'start","\ufdd0'duration"],{"\ufdd0'start":new Date,"\ufdd0'duration":"\ufdd0'duration".call(k,d)}))),Wc.call(k,bg),a=V.call(k,"step",a),b=Kf.call(k,Yf).document.body,d=jd.call(k,b),b.scrollTop=ud.call(k,d.Qa(a))):k}function dg(a){return cg.call(k,Qe.call(k,a))}
+function eg(a){vd.call(k,"",{target:"traction-notes"}).close();var b=vd.call(k,"",{target:"traction-notes",width:690,height:500,scrollbars:j,ub:j}),d=b.document.body,e=jd.call(k,d);If.call(k,Yf,b);rd.call(k,d,e.ka("style",$(["type"],{type:"text/css"}).H,"body{ background: #000; color: #eee; padding-bottom: 100%; }\n a { color: #88f; text-decoration: underline; cursor: pointer; }"),e.ka("h4",k,"Speaker's Notes [Traction]"));var f=M.call(k,Re.call(k,kf,Pf.call(k,a,"step")));if(D(f)){a=N.call(k,
+f);S.call(k,a,0,k);for(S.call(k,a,1,k);;){var g=a,i=S.call(k,g,0,k),g=S.call(k,g,1,k),l=f,n=e.ka("a",$(["id"],{id:V.call(k,"step",i)}).H,V.call(k,"Step ",i,": ",g.getAttribute("view")));B.call(k,n,"click",function(a,b){return function(d){return function(){return function(){return dg.call(k,d)}}(a,b)}}(a,f).call(k,i));rd.call(k,d,e.ka("div",k,n),g.cloneNode(j));a=Q.call(k,l);if(D(a))f=a,a=N.call(k,f);else break}}B.call(k,new $c(d,j),"key",function(a){a=a.keyCode;return D(I.call(k,32,a))?cg.call(k,
+Ud):D(I.call(k,39,a))?cg.call(k,Ud):D(I.call(k,37,a))?cg.call(k,we):k});return b.focus()}bg.cb=function(){var a=Kf.call(k,bg),b=fe.call(k,a),d=D(ne.call(k,b))?Y.call(k,Td,b):b,b=U.call(k,d,"\ufdd0'duration"),d=U.call(k,d,"\ufdd0'start"),b=1<(new Date-d)/(b>1?b:1)?1:(new Date-d)/(b>1?b:1);If.call(k,$f,Vf.call(k,a,b));Xf.call(k,Kf.call(k,$f));D(b>=1)&&Xc.call(k,bg)};
+window.onload=function(){Kc.call(k,"config.xml",function(a){try{var b;var f;var g=a.target;try{f=g.c?g.c.responseXML:k}catch(i){C(g.e,"Can not get responseXML: "+i.message),f=k}if(D(f))b=f.documentElement;else{var l=Lf.getElementsByTagName("steps");b=D(l)?l[0]:alert.call(k,"No traction steps found")}If.call(k,Zf,Rf.call(k,b));If.call(k,$f,S.call(k,Kf.call(k,Zf),0));Xf.call(k,Kf.call(k,$f));return eg.call(k,b)}catch(n){if(D(me.call(k,Error,n)))return alert.call(k,V.call(k,n,"\n",n.stack));else if(D("\ufdd0'else"))c(n);
+else return k}});var a=M.call(k,Zd.call(k,Lf.getElementsByTagName("rect"),0));if(D(a))for(var b=N.call(k,a);;){if(D(zf.call(k,/^view-/,b.id)))b.style.visibility="hidden";b=Q.call(k,a);if(D(b))a=b,b=N.call(k,a);else break}B.call(k,Lf,"click",function(a){return cg.call(k,D(512<a.clientX)?Ud:we)});return B.call(k,new $c(Lf,j),"key",function(a){a=a.keyCode;return D(I.call(k,32,a))?cg.call(k,Ud):D(I.call(k,39,a))?cg.call(k,Ud):D(I.call(k,37,a))?cg.call(k,we):k})};
225 src/traction.cljs
@@ -0,0 +1,225 @@
+; traction -- presentations without slides
+; Copyright 2011 (c) Chris Houser. All rights reserved.
+;
+; 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.
+
+(ns traction
+ (:require [goog.net.XhrIo :as xhrio]
+ [goog.dom :as dom]
+ [goog.style :as style]
+ [goog.window :as gwin]
+ [goog.fx.Animation :as Animation]
+ [goog.events :as events]
+ [goog.events.KeyHandler :as KeyHandler]))
+
+(def svg (.documentElement js/document))
+
+(defn parameterize [start end]
+ (let [diff (- end start)]
+ (fn [t] (+ start (* t diff)))))
+
+(defn svg-point [x y]
+ (let [point (. svg (createSVGPoint))]
+ (set! (.x point) x)
+ (set! (.y point) y)
+ point))
+
+(defn client-rect [elem]
+ (let [bbox (. elem (getBBox))
+ ctm (. elem (getCTM))
+ tl (.matrixTransform (svg-point (.x bbox) (.y bbox)) ctm)
+ br (.matrixTransform (svg-point (+ (.x bbox) (.width bbox))
+ (+ (.y bbox) (.height bbox)))
+ ctm)]
+ {:x (.x tl) :y (.y tl)
+ :width (- (.x br) (.x tl)) :height (- (.y br) (.y tl))}))
+
+(defn tags [elem tag-name]
+ ; (dom/$$ tag-name nil elem) ?
+ (prim-seq (.getElementsByTagName elem tag-name) 0))
+
+(defn elem-style [sets]
+ (reduce (fn [out elem]
+ (if-let [duration (.getAttribute elem "duration")]
+ (assoc out :duration (js/parseFloat duration))
+ (let [id (.getAttribute elem "i")]
+ (if (dom/getElement id)
+ (update-in out [id] assoc :opacity
+ (js/parseFloat (.getAttribute elem "opacity")))
+ (js/alert (str "Couldn't find elem " id ))))))
+ {} sets))
+
+(defn compute-steps [config-dom]
+ (let [init (elem-style (-> config-dom (tags "init") first (tags "set")))
+ steps (tags config-dom "step")]
+ (loop [rtn [], default init, [step & more-steps] steps]
+ (if-not step
+ rtn
+ (let [view-rect (if-let [view-id (.getAttribute step "view")]
+ (client-rect
+ (or (dom/getElement view-id)
+ (js/alert (str "Couldn't find view "view-id))))
+ (or (:view default)
+ (js/alert "First step requires a view attr")))
+ comp-step (-> (into default (elem-style (tags step "set")))
+ (assoc :view view-rect))
+ new-default (assoc (->> (tags step "set")
+ (remove #(.getAttribute % "once"))
+ elem-style
+ (into default))
+ :view view-rect)]
+ (recur
+ (conj rtn comp-step)
+ new-default
+ more-steps))))))
+
+(defn new-transition [start end]
+ (if (number? start)
+ (if (= start end)
+ start
+ (parameterize start end))
+ (zipmap (keys start)
+ (map new-transition (vals start) (vals end)))))
+
+(defn compute-animation [obj t]
+ (cond
+ (fn? obj) (obj t)
+ (map? obj) (zipmap (keys obj) (map #(compute-animation % t) (vals obj)))
+ :else obj))
+
+(defn limit-step [old-step steps f]
+ (max 0 (min (dec (count steps)) (f old-step))))
+
+; --- end pure functions ---
+
+(defn apply-world [w]
+ (doseq [[k v] w]
+ (cond
+ (= :view k)
+ (let [{:keys [x y width height]} v]
+ (.setAttribute svg "viewBox" (str x "," y "," width "," height)))
+ (= :duration k)
+ nil
+ :else
+ (let [elem (dom/getElement k)]
+ (when (:opacity v)
+ (set! (.opacity (.style elem)) (:opacity v)))))))
+
+(def notes-window (atom nil))
+
+(def computed-steps (atom nil))
+
+(def world (atom nil))
+
+(def step (atom 0))
+
+(def transition (atom nil))
+
+(defn alter-step [f]
+ (let [i (swap! step limit-step @computed-steps f)
+ current-world @world
+ target-world (nth @computed-steps i)]
+ (when (not= current-world target-world)
+ ; update main window
+ (set! (.hash (.location js/document)) (str \# (pr-str {'step i})))
+ (reset! transition
+ (with-meta
+ (new-transition current-world target-world)
+ {:start (js/Date.) :duration (:duration target-world)}))
+ (Animation/registerAnimation transition)
+
+ ; update notes window
+ (let [id (str "step" i)
+ notes-body (.body (.document @notes-window))
+ notes-dom (dom/getDomHelper notes-body)]
+ (set! (.scrollTop notes-body)
+ (style/getPageOffsetTop (.getElement notes-dom id)))))))
+
+(defn set-step [i]
+ (alter-step (constantly i)))
+
+(defn open-notes [config-dom]
+ ; hack to get around blank notes on reload:
+ (. (gwin/openBlank "" (js* "{target: 'traction-notes'}")) (close))
+
+ (let [win (gwin/openBlank
+ "" (js* "{target: 'traction-notes',
+ width: ~{}, height: ~{},
+ scrollbars: true, resizable: true}"
+ gwin/DEFAULT_POPUP_WIDTH gwin/DEFAULT_POPUP_HEIGHT))
+ body (.body (.document win))
+ notesdom (dom/getDomHelper body)]
+ (reset! notes-window win)
+ (dom/append body
+ (.createDom notesdom "style" (.strobj {"type" "text/css"})
+ "body{ background: #000; color: #eee; padding-bottom: 100%; }
+ a { color: #88f; text-decoration: underline; cursor: pointer; }")
+ (.createDom notesdom "h4" nil "Speaker's Notes [TractionSVG]"))
+ (doseq [[i step] (map-indexed vector (tags config-dom "step"))]
+ (let [a (.createDom notesdom "a" (.strobj {"id" (str "step" i)})
+ (str "Step " i ": " (.getAttribute step "view")))]
+ (events/listen a "click" ((fn [i] #(set-step i)) i)) ; CLJS-59
+ (dom/append body (.createDom notesdom "div" nil a)
+ (.cloneNode step true))))
+ (events/listen
+ (events/KeyHandler. body true) KeyHandler/EventType.KEY
+ (fn [e]
+ (condp = (.keyCode e)
+ events/KeyCodes.SPACE (alter-step inc)
+ events/KeyCodes.RIGHT (alter-step inc)
+ events/KeyCodes.LEFT (alter-step dec)
+ nil)))
+ (. win (focus))))
+
+(set! (.cycle transition)
+ (fn []
+ (let [trans @transition
+ {:keys [start duration]} (meta trans)
+ t (min 1 (/ (- (js/Date.) start) (max duration 1)))]
+ (reset! world (compute-animation trans t))
+ (apply-world @world)
+ (when (>= t 1)
+ (Animation/unregisterAnimation transition)))))
+
+(set! (.onload (js* "window"))
+ (fn []
+ (xhrio/send "config.xml"
+ (fn [x]
+ (try
+ (let [config (if-let [xml (. (.target x) (getResponseXml))]
+ (.documentElement xml)
+ (if-let [elems (.getElementsByTagName svg "steps")]
+ (aget elems 0)
+ (js/alert "No traction steps found")))]
+ (reset! computed-steps (compute-steps config))
+ (reset! world (nth @computed-steps 0))
+ (apply-world @world)
+ (open-notes config))
+ (catch js/Error e
+ (js/alert (str e \newline (.stack e)))))))
+
+ ; Hide view boxes
+ (doseq [rect (prim-seq (.getElementsByTagName svg "rect") 0)]
+ (when (re-find #"^view-" (.id rect))
+ (set! (-> rect .style .visibility) "hidden")))
+
+ (events/listen svg "click"
+ #(alter-step (if (< 512 (.clientX %)) inc dec)))
+
+ (events/listen
+ (events/KeyHandler. svg true) KeyHandler/EventType.KEY
+ (fn [e]
+ (condp = (.keyCode e)
+ events/KeyCodes.SPACE (alter-step inc)
+ events/KeyCodes.RIGHT (alter-step inc)
+ events/KeyCodes.LEFT (alter-step dec)
+ nil)))))
+

0 comments on commit 5274144

Please sign in to comment.